2012-02-19 15 views
3

複数のモデルをコントローラーに戻すMVCビューがあります。私は、ユーザーが同じフォームからX個の「違反」を追加できるようにする機能を追加するという要件があります。私がしたいことは、IEnumerableの "Infractions"オブジェクトをコントローラにポストバックすることと比較することができます。これを行うにはいくつかの方法があった場合、それは素晴らしいことだ:私は、その後のIEnumerableを反復し、違反を追加することになりモデルの複数のインスタンスを同じフォームでコントローラに渡すことはできますか?

[HttpPost] 
public ActionResult Create(IEnumerable<Infractions> infractions) 

提案がありますか?

答えて

2

これは間違いなく可能です。この問題についてはPhil Haack's postを参照してください。

トリックは、モデルバインダーがそれをリスト/配列として認識するように、最初のgetプロパティ名を正しい形式で表示することです。

例えば:

<input type='text' name='[0].Property1OnInfractions' /> 
<input type='text' name='[0].Property2OnInfractions' /> 

<input type='text' name='[1].Property1OnInfractions' /> 
<input type='text' name='[1].Property2OnInfractions' /> 


あなたが仕事に以下を得るためのIListにあなたのIEnumerableを変換する必要があり、あなたの場合は :

@for(int i = 0; i < Model.Count(); i++) 
{ 
    @Html.TextBoxFor(m => m[i].Property1OnInfractions) 
    @Html.TextBoxFor(m => m[i].Property2OnInfractions) 
} 

と行動署名はこの

のようになります。
[HttpPost] 
public ActionResult Create(List<Infractions> infractions) 
+0

署名を次のように使用する方がよいでしょう。 public ActionResult Create(IList 違反) '? –

+0

@jimtollan、元のコードはHttpPostで動作する 'IEnumerable'としてさらに汎用的でしたが、誰かが' List'に対して私の答えを編集していました:( –