2011-06-21 78 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