Razor中数组的唯一字段名称

时间:2019-06-06 17:38:17

标签: asp.net razor asp.net-mvc-5

我有一个模特

public class DataModel
{
    public List<GeneratorReportModel> myGenerators{ get; set; }
}

视图为

@using (Html.BeginForm("Index", "DataEntry", FormMethod.Post))
{
   for (int i = 0; i < 15; i++)
   {
   @Html.TextBoxFor(m => m.myGenerators.ElementAt(i).my_field)
   <br />
   }
}

和控制器捕获表格POST

public ActionResult Index(DataModel dataModel)
{
  return Content("ADDED>MYfieild>" dataModel.myGenerators.ElementAt(0).my_field);
}

当为上面的视图生成HTML时,所有文本框都具有相同的“名称”属性,并且在表单发布时从ActionResult获取的值始终不正确。 怎么做?

2 个答案:

答案 0 :(得分:0)

需要更多信息,请尝试以下伪代码:

@using (Html.BeginForm("Index", "DataEntry", FormMethod.Post))
{
   for (int i = 0; i < 15; i++)
   {
   <input type="text" name="my_field@i" value="@Model.myGenerators.ElementAt(i).my_field">
   <br />
   }
}

答案 1 :(得分:0)

在您看来,如果您改用列表中的索引器,则ModelBinder将选择它们并正确命名:

@using (Html.BeginForm("Index", "DataEntry", FormMethod.Post))
{
   for (int i = 0; i < 15; i++)
   {
   @Html.TextBoxFor(m => m.myGenerators[i].my_field)
   <br />
   }
}

这样,输出将更像:

<input type='textbox' name='myGenerators[0].my_field'/>
<input type='textbox' name='myGenerators[1].my_field'/>

然后,在控制器上使用的ModelBinder可以将其解释为IEnumerable<T>,您将看到您的集合已初始化。