可空布尔下拉列表的编辑器模板未呈现

Editor Template for Nullable Boolean Dropdown list not rendering

我有一个名为 Critical 的 属性,它是一个 Nullable Bool,例如 "NULL, True, False) stored in a tabe as Critical bit null. User can select "Yes/No 或空白(将值存储为 NULL)

我在 Shared/EditorTemplates 中创建了一个名为 FriendlyBool.cshtml

的编辑器模板
@model bool? 
@using System.Web.Mvc   
@{   
    var selectList = new List<SelectListItem>();  
    selectList.Add(new SelectListItem { Text = "", Value = "" }); 
    selectList.Add(new SelectListItem { Text = "Yes", Value = "true", Selected = Model.HasValue && Model.Value }); 
    selectList.Add(new SelectListItem { Text = "No", Value = "false", Selected = Model.HasValue && !Model.Value });
 } 

在我看来我称这个编辑器为模板

 <div class="bodyContent">
        <span class="leftContent">
            @Html.Label("Critical")
        </span><span class="rightContent">
         @Html.EditorFor(model => model.critical, "FriendlyBool")
        </span>
    </div>

当我 运行 我的视图时,我看到默认下拉列表的值为 "Not Set, "True" 和 "False"。为什么我的编辑器模板不显示?

EditorTemplate 没有生成任何 html(只是创建了一个 SelectList)。将模板更改为

@model bool? 
@using System.Web.Mvc   
@{   
    var selectList = new List<SelectListItem>();  
    selectList.Add(new SelectListItem { Text = "Yes", Value = "true" }); 
    selectList.Add(new SelectListItem { Text = "No", Value = "false" });
} 
@Html.DropDownListFor(m => m, selectList, "")

还要确保您 属性 没有 [Required] 属性。

旁注

  1. 使用接受 labelOptionDropDownListFor() 的重载 生成 null 选项
  2. 不需要设置SelectListItemSelected属性。 您正在绑定到 属性,因此如果值 null,则第一个 选项将被选中,或者如果其 true 第二个选项 ("Yes") 将被选中。

如果您想从数据库更新 属性,请使用:

@using System.Web.Mvc
@model bool?
@{
var selectList = new List<SelectListItem>();
selectList.Add(new SelectListItem { Text = "", Value = String.Empty,Selected = !Model.HasValue });
selectList.Add(new SelectListItem { Text = "Yes", Value = "true",Selected = Model.HasValue && Model.Value });
selectList.Add(new SelectListItem { Text = "No", Value = "false", Selected = Model.HasValue && !Model.Value });}
@Html.DropDownListFor(m => m, selectList)

您也可以为您的 属性 使用 [UIHint("FriendlyBool")] 属性来使用此模板

扩展 alireza 的答案以适应传递的 htmlAttributes:

@model bool?
@{
    var selectList = new List<SelectListItem>
    {
        new SelectListItem {Text = "(Any)", Value = String.Empty, Selected = !Model.HasValue},
        new SelectListItem {Text = "Yes", Value = "true", Selected = Model.HasValue && Model.Value},
        new SelectListItem {Text = "No", Value = "false", Selected = Model.HasValue && !Model.Value}
    };
}
@Html.DropDownListFor(m => m, selectList, ViewData["htmlAttributes"])

用法:

@Html.EditorFor(model => model.critical, new
{
    htmlAttributes = new { @class = "variables-filter", disabled = "disabled" }
})