MVC3:将视图中的ICollection传递给控制器

时间:2013-01-03 16:21:56

标签: asp.net-mvc-3 view controller icollection

我有一个具有icollection类型属性的模型。

public class myClass{
   public string param1{get; set;}
   public string param2{get; set;}
   public virtual ICollection<myClass2> param3{get; set;}

   public myClass()
   {
       param3 = new hashSet<myClass2>();
   }

}

public class myClass2{
   public string param4{get; set;}
   public string param5{get; set;}
   public virtual myClass param6{get; set;}
}

我将包含这两个类的模型传递给我的视图,并且能够使用foreach(var item in Model.myClass.param3)

查看我的icollection中的项目

我将项目存储在隐藏字段中以在我的控制器中检索它

foreach(var item in Model.myClass.param3){
      @Html.HiddenFor(model => item.parm4);
      @Html.HiddenFor(model => item.parm5);
 }

但是当我提交表单并将模型传递给控制器​​时,我在调用model.myClass.param3时得到一个count = 0.

如何将ICollection传递给我的视图? 我试过this link,但不知道它为什么不起作用。

修改

该链接使用Book类作为列表进行索引(建议我将ICollection转换为列表)。我怎么做?此外,如果我将其转换为列表,我如何将其传递给控制器​​,因为控制器期望接收ICollectiion?

1 个答案:

答案 0 :(得分:1)

你不能使用foreach循环,你必须使用for循环。

for (int i=0; i<Model.MyClass.param3.Count; i++)
    {
        @Html.HiddenFor( model => model.MyClass.param3[i])
    }

原因是HiddenFor帮助器需要某种方式为每个字段分配唯一的名称,以使模型绑定起作用。 i变量可以实现此目的。

在你的情况下,你需要做一些重构来实现这个。我认为ICollectionHashSet不支持编制索引,因此您需要将其强制转换为List或某些支持索引的集合。

请参阅this excellent blog post主题。