@Html.EditorFor()渲染DropDownList而不是CheckBox

Jon*_*ood 9 asp.net-mvc editorfor razor asp.net-mvc-3

我是从WebForms到MVC 3的新手,并且有一个@Html.EditorFor()helper方法的问题.

我有一个强类型视图,表示数据库中的数据,其中一个方法是类型bool?.我希望它显示为一个复选框,但它显示为一个下拉列表,其中包含选项"未设置","真实"和"假".

将此转换为常规复选框的最简单方法是什么?

我知道我可以将数据类型更改为普通的bool,但这是我正在使用的一个大型EF实体,为此必须重新创建整个类似乎很痛苦.我也意识到我将失去跟踪"未设置"状态的能力,但显示一个简单的复选框对我来说更重要.

Pau*_*aul 10

使用复选框辅助方法,@ Html.CheckBoxFor()

它呈现下拉列表,因为复选框无法提供"未设置"值.


Ale*_*tov 6

基本上,ASP.NET MVC有一些默认模板(你可以在这里阅读).

如果您愿意,可以添加自己的EditorTemplate,ASP.NET MVC将使用它而不是默认值.对于这个你应该把一个文件"布尔{您的视图引擎扩展}"(例如:"Boolean.aspx")到任何〜/查看/ ControllerName/EditorTemplates /〜/查看/共享/ EditorTemplates /和用你自己的功能覆盖它.

这是布尔值的默认编辑器,可以由您增强:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<script runat="server">
    private List<SelectListItem> TriStateValues {
        get {
            return new List<SelectListItem> {
                new SelectListItem { Text = "Not Set", Value = String.Empty, Selected = !Value.HasValue },
                new SelectListItem { Text = "True", Value = "true", Selected = Value.HasValue && Value.Value },
                new SelectListItem { Text = "False", Value = "false", Selected = Value.HasValue && !Value.Value },
            };
        }
    }
    private bool? Value {
        get {
            if (ViewData.Model == null) {
                return null;
            }
            return Convert.ToBoolean(ViewData.Model, System.Globalization.CultureInfo.InvariantCulture);
        }
    }
</script>
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
    <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" }) %>
<% } else { %>
    <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" }) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)