16

我正在使用 twitter 引导框架,因此为了让 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; }

谢谢。

更新:所以看起来最终是创建一个空的视图模型对象并将其传递给视图,而不是让 MVC 自己创建一个。

4

4 回答 4

18

我不会那样做。如果该值可以为空,我会确保您的编辑器模板具有可空的布尔值作为模型类型。因此,您的编辑器模板(在 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>
于 2013-03-06T19:08:37.027 回答
0

阅读到目前为止的回复,我开始想知道模型对象是如何被初始化的。所以这很奇怪,但我找到了答案。希望有人可以解释其中的怪异之处。如果您不指定模型对象,可能是 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 以不同的方式创建对象的实例,比如使用反射或其他方式?

于 2013-01-21T04:10:45.120 回答
0

您可以更改模型,使其接受空值作为“是”/“否”

public bool? RememberMe { get; set; }
于 2016-07-29T16:07:17.750 回答
-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; }
 }

有关更多信息,请查看默认值表

我希望这对你有帮助。

于 2013-01-20T16:42:33.067 回答