MVC карта для обнуляемого bool в модели - PullRequest
13 голосов
/ 14 июня 2010

С моделью представления, содержащей поле:

public bool? IsDefault { get; set; }

При попытке отобразить в представлении возникает ошибка:

<%= Html.CheckBoxFor(model => model.IsDefault) %>

Невозможно неявно преобразовать тип 'bool?к "bool".Существует явное преобразование (вам не хватает приведения?)

Я пробовал приведение и использование .Value, но ни одна из них не сработала.

Обратите внимание, что мне хотелось бы, чтобыотправка формы должна установить IsDefault в модели на true или false.Значение null просто означает, что модель не была заполнена.

Ответы [ 6 ]

15 голосов
/ 16 июня 2010

Проблема в том, что у вас действительно есть три возможных значения; true, false и null, поэтому CheckBoxFor не может обрабатывать три состояния (только два состояния).

Брэд Уилсон обсуждает в своем блоге здесь . Он использует DropDownList для обнуляемых логических значений.

Этот вопрос StackOverflow гораздо лучше описывает ситуацию, чем я описал выше. Недостаток решения иногда обнуляемый, не означает ложь, он должен быть обнуляемым. Примером этого могут быть критерии фильтра, в которых вы не хотите применять true или false.

8 голосов
/ 25 мая 2012

Если вас не интересует нулевое значение, и вы просто хотите, чтобы флажок был снят, когда оно пустое, вы можете сделать следующее:

Создайте еще одно свойство типа bool в вашей модели, например:

public bool NotNullableBool
{
    get
    {
        return NullableBool == true;
    }
    set
    {
        NullableBool = value;
    }
}

Тогда просто используйте это для привязки ...

3 голосов
/ 25 октября 2014

Для меня это намного лучше:

<%= Html.CheckBox("IsDefault", Model.IsDefault.HasValue? Model.IsDefault : false) %>
1 голос
/ 10 ноября 2017

Вот как отобразить логическое свойство bool? в DropDownListFor:

@model SomeModel

<!-- ...some HTML... -->

@Html.DropDownListFor(m => m.NullableBooleanProperty, new SelectList(
        new[] { 
            new { Value = "", Text = "-- Choose YES or NO --" },
            new { Value = "true", Text = "YES" },
            new { Value = "false", Text = "NO" },
        },
        "Value",
        "Text"
    ))

А вот как сопоставить его с CheckBoxFor, используя свойство , не допускающее обнуление, в качестве обходного пути:

В ViewModel:

public bool NullableBooleanPropertyProxy
{
    get
    {
        return NullableBooleanProperty == true;
    }
    set
    {
        NullableBooleanProperty = value;
    }
}

В представлении:

@model SomeModel

<!-- ...some HTML... -->

@Html.CheckBoxFor(m => m.NullableBooleanPropertyProxy)

Единственным недостатком этого обходного пути является то, что значение null будет рассматриваться как false: если вы не можете принять это, лучше использовать элемент управления, который может поддерживать три состояния, такие как вышеупомянутый DropDownListFor.

Для получения дополнительной информации, прочитайте это сообщение в моем блоге.

0 голосов
/ 16 августа 2017

Вы можете создать шаблон редактора для отображения флажка для логических значений Nullable. Назовите шаблон Boolean.cshtml, чтобы использовать его по умолчанию для всех логических свойств сайта. Убедитесь, что файл находится в папке ~ / Views / Shared / EditorTemplates

@model bool?
@Html.CheckBox(String.Empty, Model??false)
0 голосов
/ 01 марта 2017

Чтобы добавить к vapcguy ответ, еще один более "чистый" способ сделать это, как следует

@Html.CheckBox("IsDefault", Model?.IsDefault)

Или

<%= Html.CheckBox("IsDefault", Model?.IsDefault) %>
...