簡體   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