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; }
}
Для получения дополнительной информации о проверке Таблица значений по умолчанию
Надеюсь, это поможет вам.