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

时间:2011-12-12 15:56:08

标签: asp.net-mvc asp.net-mvc-3 razor editorfor

我是从WebForms到MVC 3的新手,并且@Html.EditorFor()辅助方法存在问题。

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

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

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

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

基本上,ASP.NET MVC有一些默认模板(你can read that here)。

如果您愿意,可以添加自己的EditorTemplate,ASP.NET MVC将使用它而不是默认值。为此,您应将文件'Boolean。{your-view-engine-extension}'(例如:'Boolean.aspx')放入〜/ Views / ControllerName / EditorTemplates / 〜/ Views / Shared / 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" }) %>
<% } %>