用于Nullable布尔下拉列表的编辑器模板无法呈现

时间:2015-02-17 02:47:45

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

我有一个名为Critical的属性,它是一个Nullable Bool,例如“NULL,True,False”,存储在tabe中,作为Critical位为空。用户可以选择“Yes / No或blank(将值存储为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>

当我运行我的视图时,我看到默认下拉列表的值为“未设置”,“真”和“假”。为什么我的编辑器模板不显示?

3 个答案:

答案 0 :(得分:4)

将答案从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" }
})

答案 1 :(得分:3)

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. 使用接受DropDownListFor()的{​​{1}}重载 生成labelOption选项
  2. 无需设置null的{​​{1}}属性。 您绑定到属性,因此如果值为Selected,则为第一个 选项将被选中,或者如果其SelectListItem是第二个选项(&#34;是&#34;) 将被选中。

答案 2 :(得分:2)

如果要从数据库更新属性,请使用以下命令:

@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")]属性来使用此模板