.NET MVC Razor 动态表单生成

6
我正在使用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为空。
[HttpPost]
public virtual ActionResult Create(KpiCreateViewModel vm)
{
    return this.RedirectToAction(MVC.Kpi.Index());
}

我已在返回语句上设置了断点并检查了vm变量的内容。
有人能提供一种检索表单数据的方法吗?
谢谢您的帮助。
1个回答

4

这是因为EditorFor方法没有足够的信息来生成一个可以在提交表单时被DefaultModelBinder使用的名称。请查看在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>
}

话虽如此,这篇文章建议您可以使用foreach。但是请看生成的名称,那应该会给你一些提示。 - Tim Rogers
似乎完成了一半的任务。对象现在有一个值,但它没有Field.name。 为了澄清,KpiValue类具有Field对象、Kpi对象和Value字符串属性。 需要一种方法来识别“Field”。 - JConstantine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接