我正在使用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)
我得到一个例外,说基础值不能为空:
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自己创建一个。
答案 0 :(得分:18)
我不这样做。如果值可以为null,我将确保您的编辑器模板具有可以为空的布尔值作为模型类型。因此,您的编辑器模板(在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>
答案 1 :(得分:0)
到目前为止阅读回复,我开始想知道模型对象是如何初始化的。所以这很奇怪,但我找到了答案。希望有人可以解释这种怪异。如果你没有指定模型对象,可能就是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以不同的方式创建对象的实例,比如使用反射或其他东西吗?
答案 2 :(得分:0)
您可以更改模型,使其接受空值为&#34;是&#34; /&#34;否&#34;
public bool? RememberMe { get; set; }
答案 3 :(得分:-1)
您必须在构造函数中初始化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; }
}
有关更多信息,请检查Default Values Table
我希望这会对你有所帮助。