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创建一个在它自己的

MVC 4自定义bool (razor)模板

我不会那样做。如果值可以为空,我将确保您的编辑器模板具有可空的布尔值作为模型类型。所以你的编辑器模板(在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; }
 }

查看默认值表