asp.net-mvc - MVC3 EditorTemplate 用于使用 RadioButtons 的可为空的 bool 值

标签 asp.net-mvc asp.net-mvc-3 mvc-editor-templates

我的一个对象上有一个可以为空的 bool 值的属性,我希望我的逻辑具有 true 表示 Yes,false 表示 No,null 表示 N/A。现在因为我将在许多不同的对象上拥有多个这样的属性,所以为这些属性创建一个编辑器并显示模板是最有意义的。在这一切都工作之后,我将使用 jQuery UI 应用按钮集的视觉元素,但现在,这超出了我的问题范围。我的编辑器模板看起来像这样。

@model bool?
<div data-ui="buttonset">
@Html.RadioButtonFor(x => x, true, new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes"}) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
@Html.RadioButtonFor(x => x, false, new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No" }) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
@Html.RadioButtonFor(x => x, "null", new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA" }) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
</div>

我的问题是,在任何情况下我都无法让这个编辑器模板正确显示模型的当前值。因为我不是在这个范围内渲染模型的属性,而是模型本身,所以 MVC3 中的内置逻辑不会正确设置选中的属性,因为进行了检查以验证名称是否为空或 null(请参阅 MVC3源,InputExtensions.cs:line#259)。我无法通过与模型比较来动态设置选中的属性,因为浏览器会检查单选按钮是否存在选中的属性而不是它的值,所以即使我的单选按钮看起来像下面的最后一个仍然是选中的.
<div class="span-4" data-ui="buttonset">
<input checked="checked" id="MyObject_BooleanValueYes" name="MyObject.BooleanValue" type="radio" value="True" /><label for="MyObject_BooleanValueYes">Yes</label>
<input checked="" id="MyObject_BooleanValueNo" name="MyObject.BooleanValue" type="radio" value="False" /><label for="MyObject_BooleanValueNo">No</label>
<input checked="" id="MyObject_BooleanValueNA" name="MyObject.BooleanValue" type="radio" value="null" /><label for="MyObject_BooleanValueNA">N/A</label>
</div><span class="field-validation-valid" data-valmsg-for="MyObject.BooleanValue" data-valmsg-replace="true"></span>&nbsp;</div>

我不能使用类似 if?truevalue:falsevalue 的东西有条件地添加 HtmlAttribute因为真/假部分将是不同的匿名类型,我得到一个错误。

我正在努力解决这个问题,希望你们中的一个人对如何解决这个问题有建议?

最佳答案

@model bool?
<div data-ui="buttonset">
@{
    Dictionary<string, object> yesAttrs = new Dictionary<string, object>(); 
    Dictionary<string, object> noAttrs = new Dictionary<string, object>(); 
    Dictionary<string, object> nullAttrs = new Dictionary<string, object>(); 

    yesAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes");
    noAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No");
    nullAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA");

    if (Model.HasValue && Model.Value)
    {
        yesAttrs.Add("checked", "checked");
    }
    else if (Model.HasValue && !Model.Value)
    {
        noAttrs.Add("checked", "checked");
    }
    else
    {
        nullAttrs.Add("checked", "checked");
    }
}

@Html.RadioButtonFor(x => x, "true", yesAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
@Html.RadioButtonFor(x => x, "false", noAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
@Html.RadioButtonFor(x => x, "null", nullAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
</div>

关于asp.net-mvc - MVC3 EditorTemplate 用于使用 RadioButtons 的可为空的 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6752013/

相关文章:

c# - 如何/何时使用 json?

c# - 将域模型子计数投影到 View 模型上,无需额外查询

asp.net-mvc-3 - ExpandoObject、匿名类型和 Razor

asp.net-mvc - 如何查看 mvc 应用程序中的所有 View

asp.net-mvc-3 - 如何为 Azure 创建返回 503 的自定义维护页面?

asp.net-mvc - 编辑器模板 LabelFor - 显示值而不是名称

c# - 用于为不适用于所有枚举的枚举字段创建单选按钮的编辑器模板

c# - EditorTemplate 未按预期呈现?

asp.net-mvc - 即使没有数据也能在 Kendo Grid 中显示固定行数?

c# - 使用 AJAX 加载部分 View 不起作用