【问题标题】:Handle Nullable Types with editor template使用编辑器模板处理可空类型
【发布时间】:2011-12-07 07:37:43
【问题描述】:

我开发了一个编辑器模板,它采用布尔类型并创建一个下拉列表,将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)

【问题讨论】:

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


    【解决方案1】:

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

    ViewData.ModelMetadata.IsNullableValueType
    

    如果您阅读了这篇文章,您实际上可以看到默认模板是如何在两个不同的渲染之间切换的。随便偷吧:

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

    【讨论】:

    • 您可以在模型中使用TemplateHint 属性或将第二个参数设置为@Html.EditorFor( m =&gt; m.value, "TemplateName" ) 显式设置模型属性模板,请参阅Brad Wilsons 博客了解更多信息。
    【解决方案2】:

    My Views/Shared/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/positivefalse/0/off/negative 时,因为两者都没有是准确的,Nullable&lt;boolean&gt; 的第三个选项可以表示待定 (tbd)、未设置、未知或不适用 (n/a)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多