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)

ベースとなる値を 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; }

ありがとう。

更新:したがって、最終的には、MVC が独自に作成するのではなく、空のビュー モデル オブジェクトを作成してビューに渡すことが問題のようです。

4

4 に答える 4

18

私はそのようにはしません。値が null になる可能性がある場合は、エディター テンプレートのモデル タイプとして 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>
于 2013-03-06T19:08:37.027 に答える
0

null値を「はい」/「いいえ」として受け入れるようにモデルを変更できます

public bool? RememberMe { get; set; }
于 2016-07-29T16:07:17.750 に答える
0

ここまでの回答を読んで、モデル オブジェクトがどのように初期化されているのか疑問に思い始めました。これはかなり奇妙ですが、答えを見つけました。うまくいけば、誰かが奇妙さを説明できます。モデルオブジェクトを指定しない場合、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 がオブジェクトのインスタンスを別の方法で、たとえばリフレクションなどで作成するためでしょうか?

于 2013-01-21T04:10:45.120 に答える
-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 に答える