如何处理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) + " ")); });
其中一个解决方案可能是隐藏字段和控件名称的组合。
脚步:
- 使用隐藏字段将计数保持为行数。
- 创建控件,其名称类似于第一行的text_relation_1,第二行的text_relation_2,依此类推
- 以相同的方式生成其他控件。
- 增加和减少隐藏字段值,以便在发布值时可以知道用户添加的行数
在您的操作上使用FormCollection
并循环隐藏字段编号并从FormCollection
获取值
就像假设我创建了3行,然后我可以创建一个如下所示的动作
public ActionResult SomeActionMethod(FormCollection formCollection, string hid) { for(int i=1;i
您不需要任何额外的Ajax请求,因为您可以使用已建立的标准
function。
只需将[]
添加到添加的表单的名称中,一旦提交表单,您将在HTTP请求中以数组而不是单个值结束:
在这个例子中,你最终会得到一个数组relation
和一个数组fullname
,它们都包含你的数据集。