@Html.EditorFor() отображает DropDownList вместо CheckBox

Я новичок в WebForms в MVC 3, и у меня проблема с вспомогательным методом @Html.EditorFor().

У меня есть строго типизированное представление, представляющее данные из базы данных, и один из методов имеет тип bool?. Я бы хотел, чтобы это отображалось в виде флажка, но вместо этого оно отображается в виде раскрывающегося списка с параметрами «Не установлено», «Истина» и «Ложь».

Каков самый простой способ сделать это обычным флажком?

Я понимаю, что мог бы изменить тип данных на старый добрый bool, но я использую большой объект EF, и мне кажется, что заново создавать весь класс только для этого. Я также понимаю, что потеряю возможность отслеживать состояние «не установлено», но отображение простого флажка для меня важнее.


person Jonathan Wood    schedule 12.12.2011    source источник
comment
У вас есть элемент под названием /Views/Shared/EditorTemplates/Boolean.*?   -  person Alexander Yezutov    schedule 12.12.2011
comment
Нет, у меня нет папки EditorTemplates.   -  person Jonathan Wood    schedule 12.12.2011


Ответы (2)


Вместо этого используйте вспомогательный метод флажка, @Html.CheckBoxFor()

Он отображает раскрывающийся список, поскольку флажок не может предоставить значение «не установлено».

person Paul    schedule 12.12.2011
comment
Кажется, я могу заставить @Html.CheckBoxFor() работать с bool?. Думаю, для этого требуется bool. Я обратился ко второй части в моем вопросе. - person Jonathan Wood; 12.12.2011
comment
если значение равно NULL, то вы не должны отображать флажок. Вам нужно будет обернуть его вокруг блока if, а затем что-то вроде (@html.CheckBoxFor(m =› m.Property.Value)) - person Paul; 12.12.2011
comment
Если значение равно null, я все равно хочу отобразить текстовое поле. Я могу просто отключить его. - person Jonathan Wood; 12.12.2011
comment
@Html.CheckBoxFor(m => m.Property.Value, new { @checked = m.Property != null && m.Property}) - person hawkke; 12.12.2011

По сути, 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" }) %>
<% } %>
person Alexander Yezutov    schedule 12.12.2011