繁体   English   中英

用于bool(剃刀)的MVC 4自定义模板

[英]MVC 4 Custom template for bool (razor)

我正在使用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; }

谢谢。

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

我不这样做。 如果值可以为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>

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

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

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; }
 }

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

我希望这会对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM