1

私は2つのクラスを持っています:

public class Exercise
{
  public Guid Id {get;set;}
  public string Name {get;set;}
  public List<ExerciseItem> Items {get;set;}
}

public class ExerciseItem
{
  public Guid Id {get;set;}
  public string Name {get;set;}
  public string Content {get;set;}
}

また、Exercise オブジェクトを作成するための私の見解もあります。そのビューには「エクササイズ項目を追加」という名前のボタンがあり、ここで動的に ajax メソッドを呼び出して、ExerciseItem オブジェクトの部分ビューを返します。ビューは正しく返されます。このビューは次のとおりです。

@model Elang.Models.ExerciseItem
<div>
   <input type="hidden" name="Items.Index" value="@Model.Id" />
   <input type="hidden" id="Items@(Model.Id)__Id" name="Items[@Model.Id].Id" value="@Model.Id" />
   <input type="text" id="Items@(Model.Id)__Content" name="Items[@Model.Id].Content" class="inputText"/>
</div>

問題は、フォームを送信して「Create」メソッドが呼び出されたときです。

[HttpPost]
public ActionResult Create(Exercise exercise)
{
    //add exercise to db
    //HOWEVER!!
    //exercise.Items is empty
}

私のアイテムはnullです。私は何を間違っていますか?問題を解決するにはどうすればよいか、誰かアドバイスをいただけますか?

4

1 に答える 1

6

なぜそんなに多くの人がヘルパーメソッドを使わないことを主張し、すべてのフォームフィールドを自分でやりたいのか、私にはよくわかりません。ヘルパーは、正しく使用している限り、フォーマットが正しいことを確認します。

ただし、ここでの実際の問題は、ActionMethodが必要とするExerciseモデルと、PartialViewが使用するモデルとの間のインピーダンスの不一致ExerciseItemです。パーシャルをEditorTemplateとして使用しているため、問題が発生します。

代わりに、EditorTemplateを使用し、ヘルパーメソッドを使用すると、すべてが正しく機能します。

ビューパス(ローカルフォルダーまたは共有ビュー)にEditorTemplatesというフォルダーを作成し、。というファイルを追加しますExerciseItem.cshtml。そのファイルで、次のコードを使用します。

@model Elang.Models.ExerciseItem
<div>
    @Html.Hidden(m => m.Id)
    @Html.TextBoxFor(m => m.Content)
</div>

次に、親ビューで次を使用するだけで、すべてのコレクションが自動的に繰り返され、正しい名前のフィールドが生成されます。

@Html.EditorFor(m => m.Items)

それでもAjaxを使用してアイテムを取得する場合は、EditorForを部分ビュー内に配置し、部分ビューにエクササイズモデルを取得させます。

簡単に言えば、コレクションをレンダリングするときは、エディター/表示テンプレートを使用します。これにより、作業が非常に簡単になり、モデルバインダーが期待する正しい形式でフォームフィールドの命名規則を取得する際の頭痛の種を防ぐことができます。

「私のモデルはnullです!」のSOに関する質問の少なくとも50%は私が思うに。EditorTemplatesを正しく使用していれば、多様性は発生しません。

于 2013-03-23T16:59:43.973 に答える