如何处理ASP MVC中的重复表单字段

我有一个表格,询问用户的个人信息和他们的家庭成员。
家庭成员部分的领域正在重复。
我的问题是处理这些重复forms的最佳做法是什么?
我目前使用AJAX重复表单,但如何从这些重复字段中收集数据? 在此处输入图像描述

因为有人询问我如何重复forms,我这样做: AJAX Call

$(document).on('click', '.btn-add-item', function (e) { e.preventDefault(); var $results = $('#results'); $.ajax({ url: '/AJAX/AddFamilyForm', type: 'post', success: function (data) { $(data).appendTo($results); afterAJAX(); } }); }); 

C#代码

 [HttpPost] public PartialViewResult AddFamilyForm() { if (!Request.IsAjaxRequest()) return null; return PartialView("_FamilyForm"); } 

这是一些关于如何在MVC中使用正确的模型绑定来实现此function的框架代码。 您需要编写一些JS才能删除/添加新行。

模型

 public class MyModel { public FamilyMembers[] FamilyMembers { get; set; } } 

视图

  @if (Model.FamilyMembers != null) { for (int i = 0; i < Model.FamilyMembers.Length; i++) {    @Html.Hidden("FamilyMembers.Index", i)   @Html.TextBoxFor(m => Model.FamilyMembers[i].Relation)   @Html.TextBoxFor(m => Model.FamilyMembers[i].FullName)   } } 

以下是添加新成员的代码。 它动态创建html,并且由于命名约定,它能够绑定到发布的模型。 time为每个添加的行提供唯一的ID,以便所有数据保持在一起。

JS(使用Jquery)

 var hidden = '@Html.Hidden("FamilyMembers.Index", "{id}")'; var relationHtml = '@Html.TextBox("FamilyMembers[{id}].Relation")'; var fullNameHtml = '@Html.TextBox("FamilyMembers[{id}].FullName")'; $("#addNewFamilyMember").on("click", function () { var time = Date.now(); var deleteHtml = ""; $("#familyMembers-table").find("tbody") .append($("" + hidden.replace("{id}", time) + deleteHtml + "" + "" + relationHtml.replace("{id}", time) + "" + "" + fullNameHtml.replace("{id}", time) + "")); }); 

其中一个解决方案可能是隐藏字段和控件名称的组合。

脚步:

  1. 使用隐藏字段将计数保持为行数。
  2. 创建控件,其名称类似于第一行的text_relation_1,第二行的text_relation_2,依此类推
  3. 以相同的方式生成其他控件。
  4. 增加和减少隐藏字段值,以便在发布值时可以知道用户添加的行数

在您的操作上使用FormCollection并循环隐藏字段编号并从FormCollection获取值

就像假设我创建了3行,然后我可以创建一个如下所示的动作

 public ActionResult SomeActionMethod(FormCollection formCollection, string hid) { for(int i=1;i 

您不需要任何额外的Ajax请求,因为您可以使用已建立的标准

function。

只需将[]添加到添加的表单的名称中,一旦提交表单,您将在HTTP请求中以数组而不是单个值结束:

    

在这个例子中,你最终会得到一个数组relation和一个数组fullname ,它们都包含你的数据集。