MVC3剃刀:使用jQuery添加自定义类列表

时间:2011-12-21 21:59:46

标签: jquery asp.net-mvc-3 razor

我有类似这样的课程设置

 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是首选,但我可以使用任何有效的东西

2 个答案:

答案 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);