MVC 4 Пользовательский шаблон для bool (бритвы)

Я использую фреймворк twitter bootstrap, поэтому для того, чтобы получить методы EditorFor и DisplayFor для вывода того, что мне нужно, я создал настраиваемые шаблоны для каждого из типов, таких как строка, текст, пароль и т.д. Для моей страницы входа мне нужна функция RememberMe bool, как и раньше, я создал следующий шаблон и ввел в Boolean.cshtml:

@model bool

<div class="control-group">
    <div class="controls">
        <label class="checkbox">
            @Html.CheckBoxFor(m => m, new {@class = "checkbox"})
            @Html.LabelFor(m => m)
        </label>
    </div>
</div>

Довольно просто, но когда я использую:

@Html.EditorFor(m => m.RememberMe)

Я получаю исключение, говорящее, что значение, базирующееся на басу, не может иметь значение null:

The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'System.Boolean'.

Что мне не хватает? Похоже, это должно быть прямо. Поле объекта модели выглядит следующим образом:

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }

Спасибо.

UPDATE:. Похоже, что в конечном итоге это вопрос создания пустого объекта модели представления и передачи его в представление вместо того, чтобы позволить MVC создать его самостоятельно.

Ответ 1

Я бы так не сделал. Если значение может быть нулевым, я бы удостоверился, что ваш шаблон редактора имеет значение nullable boolean как тип модели. Таким образом, ваш шаблон редактора (в Views\Shared\EditorTemplates\Boolean.cshtml) будет выглядеть следующим образом:

@model Boolean?

@Html.CheckBox("", Model.HasValue && Model.Value)

И затем в бритве вашего основного вида вы можете:

<div class="control-group">
    <div class="controls">
        <label class="checkbox">
            @Html.EditorFor(m => m, new {@class = "checkbox"})
            @Html.LabelFor(m => m)
        </label>
    </div>
</div>

Ответ 2

Прочитав ответы до сих пор, я начал задаваться вопросом, как инициализируется объект модели. Так что это довольно странно, но я нашел ответ. Надеюсь, кто-то может объяснить странность. Возможно, MVC инициализирует объект модели, если вы не укажете его.

В качестве шаблона для входа в систему по умолчанию используется шаблон MVC Internet:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;

    return View();
}

Это дает ошибку. Однако изменение его на следующее устраняет проблему:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    var loginModel = new LoginModel();

    ViewBag.ReturnUrl = returnUrl;

    return View(loginModel);
}

Таким образом, это отвечает на вопрос о том, как решить проблему, но по-прежнему оставляет неразрешенную причину. Может быть, потому, что MVC создает экземпляр объекта по-другому, скажем, с отражением или чем-то?

Ответ 3

Вы можете изменить свою модель, чтобы она принимала нулевые значения как "да" / "нет"

public bool? RememberMe { get; set; }

Ответ 4

Вы должны инициализировать RememberMe bool value внутри конструктора, как показано ниже.

Помните, что использование неинициализированных переменных в С# недопустимо.

using System.ComponentModel; 

public class ClassName
 {    
   public ClassName ()
        {
            RememberMe = false;
        }

   [DefaultValue(false)]
   [Display(Name = "Remember me?")]
   public bool RememberMe { get; set; }
 }

Для получения дополнительной информации о проверке Таблица значений по умолчанию

Надеюсь, это поможет вам.