2011-06-21 47 views
6

MVCでサイトを構築しています。ビューに渡すビューにカスタムオブジェクトのIEnumarableリストが含まれているカスタムオブジェクトが含まれています。.NET MVC Razor動的フォームの生成

razorは、任意の数のオブジェクトであるIEnumerableのフォームを動的に生成するという考えです。

@foreach (var data in Model.Kpi.Values) 
{ 
    <div class="editor-label"> 
     @Html.Label(data.Field.Name); 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => data.Value) 
     @Html.ValidationMessageFor(model => data.Value) 
    </div> 
} 

フォームは、データアノテーションを完全に表示しますが、コントローラのポスト関数ではIEnumerableはnullです。

[HttpPost] 
public virtual ActionResult Create(KpiCreateViewModel vm) 
{ 
    return this.RedirectToAction(MVC.Kpi.Index()); 
} 

return文にブレークポイントを設定し、vm変数の内容を検査しました。

誰でもフォームデータを取得する方法を提案できますか?事前

EditorFor方法は、あなたが戻って投稿するとき DefaultModelBinderで使用可能な名前を生成するのに十分な情報を持っていないためにです

答えて

2

感謝。 HTMLで生成されているname属性を見てください。名前は、渡す式から生成されますが、ループ内のプロパティへの完全パスは必要ありません。

インデックス付きループに変更すると、になるはずです。

@for(var i=0; i<Model.Kpi.Values.Count(); i++) 
{ 
    <div class="editor-label"> 
     @Html.Label(model.Kpi.Values[i].Field.Name); 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Kpi.Values[i].Value) 
     @Html.ValidationMessageFor(model => model.Kpi.Values[i].Value) 
    </div> 
} 
+0

[このポスト](http://stackoverflow.com/questions/1983999/how-to-use-editorfor-inside-a-foreachが)あなたが 'foreach'を使用できることを示唆している、と述べました。しかし、生成されている名前を見て、それはあなたに手がかりを与える必要があります。 –

+0

それは戦いの半分をしたようです。オブジェクトには値がありますが、Field.nameはありません。 KpiValueクラスを明確にするために、プロパティ、フィールドオブジェクト、Kpiオブジェクト、および値文字列があります。 「フィールド」を特定する方法が必要です。 – JConstantine

関連する問題