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

Tyr*_*erk 16 .net c# asp.net-mvc 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>
Run Code Online (Sandbox Code Playgroud)

很简单,但是当我使用时:

@Html.EditorFor(m => m.RememberMe)
Run Code Online (Sandbox Code Playgroud)

我得到一个例外,说基础值不能为空:

The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'System.Boolean'.
Run Code Online (Sandbox Code Playgroud)

我错过了什么?似乎它应该是直截了当的.模型对象上的字段如下所示:

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
Run Code Online (Sandbox Code Playgroud)

谢谢.

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

Jon*_*han 18

我不这样做.如果值可以为null,我将确保您的编辑器模板具有可以为空的布尔值作为模型类型.所以你的编辑器模板(在Views\Shared\EditorTemplates\Boolean.cshtml中)将是:

@model Boolean?

@Html.CheckBox("", Model.HasValue && Model.Value)
Run Code Online (Sandbox Code Playgroud)

然后在主视图的剃须刀中,您可以:

<div class="control-group">
    <div class="controls">
        <label class="checkbox">
            @Html.EditorFor(m => m, new {@class = "checkbox"})
            @Html.LabelFor(m => m)
        </label>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)