【问题标题】:Unique field name for arrays in RazorRazor 中数组的唯一字段名称
【发布时间】:2019-10-22 06:26:01
【问题描述】:

我有一个模型

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 获得的值始终不正确。 这是怎么做到的?

【问题讨论】:

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


    【解决方案1】:

    需要更多信息,试试这个伪代码:

    @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 />
       }
    }
    

    【讨论】:

    • 谢谢,这会为每个文本框生成唯一的名称,但是当我提交时,尽管我在第一个文本框中输入了另一个值,但它仍然会打印“ADDED>MYfiield>0”。
    【解决方案2】:

    在您看来,如果您改为使用列表中的索引器,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&lt;T&gt;,您将看到您的集合已初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多