2011-06-21 110 views
6

我在MVC中構建一個站點,並將傳遞給View的視圖模型包含一個自定義對象,該對象又包含一個IEnumarable自定義對象列表。.NET MVC 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在控制器post函數中爲null。

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

我在return語句中放了一個斷點並檢查了vm變量的內容。

任何人都可以提出一種方法來檢索表單數據?

在此先感謝

回答

2

這是因爲EditorFor方法沒有足夠的信息來生成可以由DefaultModelBinder,當你回來後可以使用的名字。查看HTML中正在生成的名稱屬性。該名稱是從您傳遞的表達式生成的,但您不必在循環中的屬性的完整路徑。

將其更改爲索引循環,並且它應該工作。

@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類具有屬性,Field對象,Kpi對象和Value字符串。 需要一些方法來識別「字段」。 – JConstantine