使用编辑器模板处理可空类型

时间:2011-10-13 21:23:54

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我开发了一个采用布尔类型的编辑器模板,并创建了一个下拉列表,将truefalse默认值更改为SiNo。现在,当我部署应用程序时,我没有意识到booleanNullable<boolean>与我的编辑器模板(boolean.cshtml)的名称相同并受到影响。现在我不想要这个,我想修改editorfor的行为,只有当模型的数据类型为Nullable<boolean>而不是它的布尔值时。我怎么能处理这个?

 @model Nullable<bool>

@{
    var listItems = new[]
    {
        new SelectListItem { Value = "true", Text = "Si" },
        new SelectListItem { Value = "false", Text = "No" }
    };  

}


@Html.DropDownListFor( model => model.Value, listItems)

2 个答案:

答案 0 :(得分:14)

您无法使用相同的编辑器模板阻止它们。但您可以在编辑器模板中处理它。你有:

ViewData.ModelMetadata.IsNullableValueType

如果您阅读本文,您实际上可以看到默认模板使用此功能在两个不同的渲染之间切换。只是偷了它:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

答案 1 :(得分:3)

我的观点/共享/ EditorTemplates / Boolean.cshtml两种方式,处理可空和常规复选框。

@model bool?
@{
    if (ViewData.ModelMetadata.IsNullableValueType)
    {
        <text><div class="RB"></text>
        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, "", nullAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA" class="nostrong" title="Unknown or To Be Determined">tbd</label>
        @:</div>
    }
    else
    {
        ModelState state = ViewData.ModelState[ViewData.ModelMetadata.PropertyName];
        bool value = Model ?? false;
        if (state != null && state.Errors.Count > 0)
        {
            <div class="input-validation-error" style="float: left"></div>
        }
        else
        {
            @Html.CheckBox("", value)
        }
    }
}

只有2-3个选项的下拉列表对用户不重视;它们需要两次点击,而单选按钮只需要一次点击(除非您没有房地产)。

当您的客户/用户尚未做出决定时,不想制作一个,不要认为您知道答案是您的任何业务,或者需要取消设置true/1/on/positive或{{1因为两者都不准确,false/0/off/negative的第三个选项可以表示待定(tbd),未设置,未知或不适用(不适用)。