0

私はMVC3でEFを使用しています。

カスタムリストのあるモデルがあります。

public List<MarketingModel> Marketing { get; set; }

コンストラクターでこれを次のように初期化します。

 this.Marketing = new List<MarketingModel>();

私はそれをビューで表示します:

@foreach (MarketingModel m in Model.Marketing)
{

 <td class="title">@Html.DisplayFor(model => m.Name)</td>
 <td>@Html.CheckBoxFor(model => m.Mail)</td>
 <td>@Html.CheckBoxFor(model => m.Email)</td>

}

これは問題なく表示されます。ただし、ページを保存すると、何らかの理由でマーケティングがnull値として渡されます。

本当にこれに困惑しました。

4

3 に答える 3

3

foreachループを使用しないでください。ヘルパー メソッドはXXXFor、モデルからプロパティへのプロパティ パスを決定するように設計された式ツリーを使用します。このプロパティ パスはname、対応する HTML 入力要素の属性を構築するために使用されます。

ラムダでモデルを使用していないため ( model => m.Name<-- を使用していないことに注意してくださいmodel)、プロパティ パスが正しくありません。代わりに、forループを使用します。

@for (int i = 0; i < Model.Marketing.Count; i++) 
{
    <td class="title">@Html.DisplayFor(model => Model.Marketing[i].Name)</td>
    <td>@Html.CheckBoxFor(model => Model.Marketing[i].Mail)</td>
    <td>@Html.CheckBoxFor(model => Model.Marketing[i].Email)</td>
}

このようにして、プロパティへのパス全体が式ツリー ( Model.Marketing[i].Name) に含まれ、対応するname属性にそのフル パスが含まれるようになります。したがって、保存すると、データがそこにあるはずです。

于 2012-05-16T17:47:04.890 に答える
0

新しいスコープをModel.Marketingに設定するforeachがあるため、投稿はMVCバインディングを混乱させます。作成されたHTMLを調べて、問題のフィールドのname属性に注意を払います。名前は、他のモデルプロパティと同じパターンである必要があります。

リスト/コレクションオブジェクトの場合、特定のアイテムを指定するために配列型のインデックスを使用できます。たとえば、フィールドがModel.Marketing.Mailにバインドすることを意図している場合、名前は「Marketing[2].Mail」のようになります。

プロパティのプロパティを使用してモデルを深く掘り下げるときはいつでも、上記のように名前を調整するか、オブジェクトを処理するための新しいhtmlhelper拡張機能を作成して、@ Html.DisplayFor(m=>mなどを使用できるようにする必要があります。マーケティング)、またはコントローラーでカスタムモデルバインダーを記述して、この名前の一致を修正することもできます。また、コントローラーのコンテキストでRequestオブジェクトにアクセスして、投稿されたフォーム要素を選択できるようにします。

それでもヘルプが必要な場合は、生成されたhtmlスニペットを投稿してください。

于 2012-05-16T17:50:50.480 に答える
0

Phil Haack の MVC binding to a list を確認してください。必要な情報がすべて含まれています。

于 2012-05-16T17:46:14.563 に答える