MVC 4自定义bool (razor)模板
本文关键字:razor 模板 bool 自定义 MVC | 更新日期: 2023-09-27 17:55:02
我正在使用twitter bootstrap框架,因此要获得EditorFor和DisplayFor方法来输出我需要的内容,我为每种类型(如字符串,文本,密码等)创建了自定义模板。对于我的登录页面,我想要一个memorberme 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创建一个在它自己的
我不会那样做。如果值可以为空,我将确保您的编辑器模板具有可空的布尔值作为模型类型。所以你的编辑器模板(在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>
阅读到目前为止的响应,我开始想知道模型对象是如何初始化的。这有点奇怪,但我找到了答案。希望有人能解释一下这奇怪的地方。可能是MVC如何初始化一个模型对象,如果你没有指定一个。
默认的MVC Internet模板有以下Login动作:
[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以不同的方式创建对象的实例,比如用反射或其他方式?
你可以改变你的模型,让它接受空值为"yes"/"no"
public bool? RememberMe { get; set; }
您必须在构造函数中初始化RememberMe
bool value
,如下所示。
请记住,在c#中不允许使用未初始化的变量。
using System.ComponentModel;
public class ClassName
{
public ClassName ()
{
RememberMe = false;
}
[DefaultValue(false)]
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
查看默认值表