我开发了一个采用布尔类型的编辑器模板,并创建了一个下拉列表,将true
和false
默认值更改为Si
和No
。现在,当我部署应用程序时,我没有意识到boolean
和Nullable<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)
答案 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),未设置,未知或不适用(不适用)。