9

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

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

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

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

4

2 回答 2

10

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

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

于 2011-12-12T16:01:19.947 回答
6

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

如果您愿意,可以添加自己的 EditorTemplate,ASP.NET MVC 将使用它而不是默认值。为此,您应该将文件“Boolean.{your-view-engine-extension}”(例如:“Boolean.aspx”)放入~/Views/ControllerName/EditorTemplates/~/Views/Shared/EditorTemplates/和用您自己的功能覆盖它。

这是 Boolean 的默认编辑器,您可以对其进行增强:

<%@ 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" }) %>
<% } %>
于 2011-12-12T16:14:09.290 回答