我的一个对象上有一个可以为空的布尔值的属性,我希望我的逻辑具有 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> </div>
我不能有条件地添加 HtmlAttribute 使用类似if?truevalue:falsevalue
的东西,因为真/假部分将是不同的匿名类型,我得到一个错误。
我正在努力解决这个问题,希望你们中的一个人对如何解决这个问题有建议?