【问题标题】:.NET MVC Razor Dynamic Form Generation.NET MVC Razor 动态表单生成
【发布时间】:2011-09-19 16:35:20
【问题描述】:

我正在 MVC 中构建一个站点,我传递给我的视图的视图模型包含一个自定义对象,该对象又包含一个自定义对象的 IEnumarable 列表。

这个想法是 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>
}

表单显示完美,包括数据注释,但控制器 post 函数中的 IEnumerable 为空。

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

我在 return 语句上放了一个断点并检查了 vm 变量的内容。

谁能推荐一种检索表单数据的方法?

提前致谢

【问题讨论】:

    标签: c# asp.net forms asp.net-mvc-3


    【解决方案1】:

    这是因为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>
    }
    

    【讨论】:

    • 话虽如此,this post 建议您可以使用foreach。但是看看正在生成的名称,这应该会给你一个线索。
    • 这似乎已经成功了一半。该对象现在有一个值,但它没有 Field.name。澄清一下 KpiValue 类有属性、Field 对象、Kpi 对象和 Value 字符串。需要某种方式来识别“字段”。
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多