使用编辑器模板处理可空类型

我开发了一个编辑器模板,它采用布尔类型并创建一个下拉列表,将true值和false值默认值更改为SiNo 现在,当我部署应用程序时,我没有意识到booleanNullable被视为相同,并且影响了我的编辑器模板的名称(boolean.cshtml)。 现在我不想要这个,我想修改编辑器的行为,只有当模型的数据类型是Nullable而不是它的布尔值时。 我该怎么办?

  @model Nullable @{ var listItems = new[] { new SelectListItem { Value = "true", Text = "Si" }, new SelectListItem { Value = "false", Text = "No" } }; } @Html.DropDownListFor( model => model.Value, listItems) 

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

 ViewData.ModelMetadata.IsNullableValueType 

如果您阅读本文,您实际上可以看到默认模板使用此function在两个不同的渲染之间切换。 只是偷了它:

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

我的Views / Shared / EditorTemplates / Boolean.cshtml有两种方式,处理可空和常规复选框。

 @model bool? @{ if (ViewData.ModelMetadata.IsNullableValueType) { 
Dictionary yesAttrs = new Dictionary(); Dictionary noAttrs = new Dictionary(); Dictionary nullAttrs = new Dictionary(); yesAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes"); noAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No"); nullAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "n/a"); 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) @Html.RadioButtonFor(x => x, "false", noAttrs) @Html.RadioButtonFor(x => x, "", nullAttrs) @: } else { ModelState state = ViewData.ModelState[ViewData.ModelMetadata.PropertyName]; bool value = Model ?? false; if (state != null && state.Errors.Count > 0) {
}else{ @Html.CheckBox("", value) } } }

只有2-3个选择项目的下拉列表对用户不重要,因为它们需要2次点击,而单选按钮只需要一次点击 – 除非您没有房地产。 当您的客户/用户尚未做出决定时,不想制作一个,不要认为您知道答案是您的任何业务,或者需要取消设置为真/ 1 /开/正或假/ 0 / off / negative因为两者都不准确,可以为空的布尔值的第3个选项可以表示待定(tbd),未设置,未知或不适用(n / a)。