2016-11-08 14 views
3

publicと呼ばれるフィールドに関連して私のビューに表示したいチェックボックスがあります。これは基本的に特定の行がpublicかどうかを示します。データベースでは、これはビットフィールドですが、これまでテーブルがどのように動作していたかによって、NULLが許されます。MVCはnull可Boolを持つHtml.CheckBoxForを使用します

私はHtml.CheckBoxForを使用していますが、システムではboolタイプではなくむしろboolなので、このフィールドについて不平を言っていますか?タイプ。フィールド値がnullの場合、フロントエンドでfalseとカウントされます(残念ながら、データベース値自体を更新することはオプションではありません)。

私はGetValueOrDefaultを使用してみました、とのラインに沿って私のモデルファイルにデフォルト値を入れている:それは私に次のエラーを与えて、この文句を言ったが

public class Model 
{ 
    public bool? Public { get; set; } 

    public SearchModel() 
    { 
     Public = false; 
    } 
} 

An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code 

Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. 

私はここからどのように進むことができるのか分からない、誰かが正しい方向に私を向けるのを助けることができますか?

EDIT:

は、この私は、チェックボックスを表示するために使用しようとしているビュー上のコードです。

Html.CheckBoxFor(model => model.Public, new {data_toggle = "toggle", data_off = "No", data_on = "Yes", data_size = "small"}) 
+0

いくつかの問題 –

+0

あなたはEFエンティティへのモデルバインディングのようですね。これは非常に柔軟性がなく、一般的には良い考えではありません。 – usr

+0

@AlfieGoodacre良い点、私はいくつかのことを周りに変更しているし、それを逃した必要があります。変数に関しては、それがデータベース内でフィールドが呼び出されたものなので、モデルファイル内で変数名を同じにしておきました。残念なことに、データベースフィールドが呼び出されたときに何の言葉も出さなかった –

答えて

6

を、それはトグルではなく、単純なチェックボックスとして表示されるように、この例では、私はいくつかの余分なHTML属性を追加していますあなたが評価できないテンプレート化されたヘルパーの1つに式を渡すときに発生する特定の例外です。式ベースのヘルパーを使用しているときは、実際には値でプロパティを渡すのではなく、というモデルを表し、そのプロパティを参照するためにヘルパーが使用する式を生成するということを覚えておいてください以下からのフィールド名などは

あなたは、あなたがこれをやっている実際のコードを示していないが、これはあなたのような何かを行うことができない、本質的意味:テンプレートヘルパーは解決できないので

@Html.EditorFor(m => m.Public.GetValueOrDefault()) 

をそれはあなたのモデルのプロパティとマッチする式として。

実際の基本的な関心事は、ヌルの場合は値をfalseに設定することです。カスタムゲッターとセッターが必要です。 @ utacoの答えは、デフォルトで自動実装プロパティの新しい簡単にC#6.0の方法を提供:C#の以前のバージョンについては

public bool? Public { get; set; } = false; 

を、あなたは以下のものが必要です。

private bool? public; 
public bool? Public 
{ 
    get { return public ?? false; } 
    set { public = value; } 
} 

しかし、nullとしてPublicを維持あなたがそれを意図していないときに実際にnullになってしまうと、コードが難しくなります。これをちょうどboolに変更できるとします(つまり、これはビューモデルであり、実際のエンティティクラスがデータベーステーブルに関連付けられているわけではありません)。あなたはまだプライベートをnullでも可能にしたいと思っています。これにより、セッターでnullを受け入れることができますが、getterの値はfalseに強制されます。つまり、publicの実際の値は常にtrueまたはfalseのいずれか(nullではない)です。

+0

ありがとうございました。私は実際には、この問題を回避するためにビューモデルを使用することを考えたことはありませんが、私はそれを作成しプラグインしました。 –

2

あなたが#6.0またはより高いC使用する場合は、この使用することができます:

public bool YourProp { get; set; } = false; 
+0

これを行うと、メインポストと同じエラーが発生します –

0

これは初期化を必要としません。 @Html.EditorFor(m => m.AnyNullableProperty) 以下は私の期待通りに働いた。私は無関係であなたのモデルが `Model`と呼ばれているが、それが原因とされますので、そのためのコンストラクタは` SearchModel`と呼ばれて注意し、誰もがこれまで変数 `Public`を呼ぶだろう、なぜ疑問を持っている

 <div class="form-group"> 
      @Html.LabelFor(model => model.RequiresBatchNumberOnReceipt, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(m => m.RequiresBatchNumberOnReceipt) 

       @Html.ValidationMessageFor(model => model.RequiresBatchNumberOnReceipt) 
      </div> 
     </div> 
関連する問題