【问题标题】:MVC3: Pass ICollection from View to controllerMVC3:将 ICollection 从视图传递到控制器
【发布时间】:2013-01-03 16:21:56
【问题描述】:

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

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)查看我的收藏中的项目

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

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 转换为列表)。我怎么做?另外,如果我将它转换为列表,我该如何将它传递给控制器​​,因为控制器期望接收 IColletiion?

【问题讨论】:

  • 链接的article 描述了如何做到这一点。您可以根据此发布您尝试过的内容吗?

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


【解决方案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 了解该主题。

【讨论】:

  • 是的,我也这么认为,但是如果 param3 是一个列表,model.MyClass.param3[i] 就可以工作。但我的是一个 ICollection,因此这样做会给我一个错误:不能将 [] 索引应用于类型 system.collection.generic.icollection
  • 正确,这就是为什么我说你需要将它转换为一个列表,或者一些支持索引的集合。
  • 简单答案:将public virtual ICollection&lt;myClass2&gt; param3{get; set;} 更改为public virtual IList&lt;myClass2&gt; param3{get; set;}param3 = new hashSet&lt;myClass2&gt;(); 更改为param3 = new List&lt;myClass2&gt;();
  • 谢谢!这是否意味着 Icollection 不能用于从视图传递到控制器?
  • 不一定,但在您的情况下,使用 List 会使事情变得非常更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多