我有类似这样的课程设置
public class MyCLass
{
//...
public IList<MyInnerClass> InnerClass { get; set;}
}
public class MyInnerClass
{
public string A { get; set;}
public string B { get; set;}
//....
}
在我的cshtml表单中,我可以把它放在所有页面上并用
之类的内容发回for(int i=0; i< Model.InnerClass.Count; i++)
{
@Html.EditorFor(m => m.InnerClass[i].A);
@Html.EditorFor(m => m.InnerClass[i].B);
}
但是现在我需要一个按钮,可以使用javascript动态地在现有的MyInnerCLass
输入下添加{{1}}输入的新实例,并且在我发布页面时仍能正确绑定所有内容。我该怎么做? jQuery是首选,但我可以使用任何有效的东西
答案 0 :(得分:1)
查看Phil Haacked博客Model Binding To A List。他几乎发布了关于默认模型绑定器如何与列表一起使用的所有内容。
只要您使用Non-Sequential Indices
方法,就可以动态地执行您想要的操作。
答案 1 :(得分:1)
一种方法是将for循环的每一行包装在某个HTML标记中,例如div或tr,以便可以使用jQuery引用它。然后,您可以使用其中一个生成的行作为模板行。索引必须替换为适当的值。假设你有这个HTML输出:
你可以用jQuery选择第一行然后克隆它,用regex替换索引,然后追加行:
var newRowIndex = x; // determine row index
var newRow = $("#rows .row").eq(0).clone(true);
newRow.find(":input").each(function() {
var name = $(this).attr("name").replace(/\[\d+\]/, "[" + rowIndex.toString() + "]");
var id = name.replace(/[.\]\[]/g, "_");
$(this).attr("name", name);
$(this).attr("id", id);
});
$("#rows").append(newRow);