我不确定你是什么意思'集合变量名',可能我的解决方案是你注意到的一种魔法。
我的解决方案是基于复制元素的现有编辑器并通过 Javascript 更改输入名称。
首先,我们需要标记我们的编辑器。这是用于收集的表单输出编辑器的代码
@for (var i = 0; i < Model.Count; i++)
{
<div class="contact-card">
@Html.LabelFor(c => Model[i].FirstName, "First Name")
@Html.TextBoxFor(c => Model[i].FirstName)
<br />
@Html.LabelFor(c => Model[i].LastName, "Last Name")
@Html.TextBoxFor(c => Model[i].LastName)
<br />
@Html.LabelFor(c => Model[i].Email, "Email")
@Html.TextBoxFor(c => Model[i].Email)
<br />
@Html.LabelFor(c => Model[i].Phone, "Phone")
@Html.TextBoxFor(c => Model[i].Phone)
<hr />
</div>
}
我们的编辑器被放入带有 class 的 div 中contact-card
。在呈现时,ASP.NET MVC 为用作属性编辑器的输入提供类似[0].FirstName
, [0].LastName
...[22].FirstName
的名称。[22].LastName
在提交模型绑定器将其转换为基于索引和属性名称的实体集合。
接下来我们创建复制最后一个编辑器并将括号中的索引增加 1 的 javascript 函数。在提交时将附加元素添加到集合中:
var lastContent = $("#contact-form .contact-card").last().clone();
$("#contact-form .contact-card").last().after(lastContent);
$("#contact-form .contact-card")
.last()
.find("input")
.each(function () {
var currentName = $(this).attr("name");
var regex = /\[([0-9])\]/;
var newName = currentName.replace(regex, '[' + (parseInt(currentName.match(regex)[1]) + 1) + ']');
$(this).val('');
$(this).attr('name', newName);
});
瞧!!提交后,我们将获得更多元素!