asp.net-mvc – 使用RadioButtons的可空值布尔的MVC3 EditorTemplate

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 使用RadioButtons的可空值布尔的MVC3 EditorTemplate前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个属性在我的一个对象是一个可空的布尔值,我希望我的逻辑具有真实的代表是,假为否,空为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内置的逻辑将不会正确设置checked属性,因为这样做是为了验证名称不为空或者为空(参见MVC3 source,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>

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

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

解决方法

@model bool?
<div data-ui="buttonset">
@{
    Dictionary<string,object> yesAttrs = new Dictionary<string,object>(); 
    Dictionary<string,object> noAttrs = new 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,nullAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
</div>

猜你在找的asp.Net相关文章