可空布尔下拉列表的编辑器模板未呈现
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]
属性。
旁注
- 使用接受
labelOption
的 DropDownListFor()
的重载
生成 null
选项
- 不需要设置
SelectListItem
的Selected
属性。
您正在绑定到 属性,因此如果值 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" }
})
我有一个名为 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]
属性。
旁注
- 使用接受
labelOption
的DropDownListFor()
的重载 生成null
选项 - 不需要设置
SelectListItem
的Selected
属性。 您正在绑定到 属性,因此如果值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" }
})