2013-01-03 38 views
1

我有一個具有icollection類型屬性的模型。MVC3:將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時得到計數爲0。

如何將ICollection傳遞給我的視圖? 我試過this link,但不知道它爲什麼不起作用。

編輯

的鏈路採用類圖書的清單,以指數(暗示我應該投中的ICollection到列表)。我怎麼做?另外,如果我把它放到一個列表中,那麼我如何將它傳遞給控制器​​,因爲控制器期望收到ICollectiion?

+0

鏈接[article](http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx)描述瞭如何去做。你可以發佈你基於這個的嘗試嗎? – nemesv

回答

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關於這個問題。

+0

是的,我也這麼認爲,但如果param3是一個列表,model.MyClass.param3 [i]就可以工作。但我的ICollection,因此這樣做給我的錯誤:不能用[]索引到一個類型爲system.collection.generic.icollection的表達式 – jpo

+0

正確,這就是爲什麼我說你需要將它轉換爲列表或一些支持索引的集合。 –

+0

見編輯請 – jpo

相關問題