执行此类操作的最简单方法是使用 ASP.NET MVC 支持将模型绑定到可枚举集合。本质上,当您为公司创建员工时,他们将被附加到使用特定字段命名结构的列表中,MVC 的模型绑定器可以使用该结构返回项目列表(员工)。
public class Company
{
public string Name { get; set; }
public IEnumerable<Employee> Employees { get; set; }
}
public class Employee
{
public string EnglishName { get; set; }
public string JapaneseName { get; set; }
}
Company Name: <input type="text" name="Name" />
<!-- Employee 1 -->
English Name: <input type="text" name="Employees[0].EnglishName" />
Japanese Name: <input type="text" name="Employees[0].JapaneseName" />
<!-- Employee 2 -->
English Name: <input type="text" name="Employees[1].EnglishName" />
Japanese Name: <input type="text" name="Employees[1].JapaneseName" />
<!-- Employee 2 -->
English Name: <input type="text" name="Employees[2].EnglishName" />
Japanese Name: <input type="text" name="Employees[2].JapaneseName" />
在上面的示例中,您会注意到对于每个员工字段,字段名称上都有一个序号索引器,这就是告诉 ASP.NET MVC 您正在绑定到一个列表并且每个 Employee[n] 是一个单独的要模型绑定的对象。保持这些索引的顺序很重要,因为如果您错过了索引,您的列表将无法正确绑定。
如果这一切都正确完成,那么您可以定义一个操作来处理接收公司对象作为参数的表单。 MVC 会自动为您处理剩下的事情。
上面的例子当然假设员工数量是静态的,但很可能永远不会出现这种情况,所以为了更灵活,我们可以使用 jQuery 为每个员工创建新行,就像你定义它们一样。正如我之前所说,索引的顺序很重要,必须保持一致。
以下添加和删除点击处理程序将确保在您创建新员工或从列表中删除现有员工时,您的字段名称将保持有序。我从我编写的其他一些代码中删除了它,并为您的目的对其进行了一些修改。我相当肯定它会成功。
$('.add-employee').click(function() {
var nextIndex = 0;
var lastRow = $(this).siblings('.row:last');
if (lastRow.length > 0) {
var lastRegion = lastRow.find('input:last');
if (lastRegion.length > 0 && /\[(\d+)\]/.test(lastRegion.attr('name')) !== null) {
var key = lastRegion.parent().find('.key:text');
if (key.val() === '') {
key.focus();
return;
}
nextIndex = parseInt(/\[(\d+)\]/.exec(lastRegion.attr('name'))[1], 10) + 1;
}
}
var namePrefix = 'Employees[' + nextIndex + ']';
var newItem = '<div class="row">\n'
+ 'English Name: <input type="text" name="' + namePrefix + '.EnglishName" /><br />\n'
+ 'Japanese Name: <input type="text" name="' + namePrefix + '.JapaneseName" /> \n'
+ '<a href="#" class="remove-employee">Remove</a>\n'
+ '</div>';
$(this).before(newItem);
});
$('.remove-employee').live('click', function() {
var parent = $(this).parent();
parent.slideUp();
parent.nextAll('div').children(':text').each(function(index, element) {
element = $(element);
if (/\[(\d+)\]/.test(element.attr('name')) !== null) {
element.attr('name', element.attr('name').replace(/\[(\d+)\]/, '[' + (parseInt(/\[(\d+)\]/.exec(element.attr('name'))[1], 10) - 1) + ']'));
}
});
parent.remove();
return false;
});
要使用这些点击处理程序,您必须定义一个类名为“add-employee”的链接/按钮,然后在每个员工记录旁边(与该员工的字段位于同一容器中)旁边定义一个名为“删除员工'。请注意在 remove-employee 处理程序上使用 live() 绑定,这将确保您通过第一个函数添加的行将具有有效的删除链接。