2014-02-13 47 views
1

我有一個從視圖模型填充的視圖,其中一個屬性是複雜類型的集合。視圖正確呈現,列表正在迭代到一個表中,每個項目還沒有被選中。當我提交表單時,我無法將對象列表返回到模型中,我無法弄清楚我做錯了什麼。集合中的每個項目被添加到如下的觀點:集合不在模型中返回

@for (int i = 0; i < Model.Items.Count; i++ 
    var rowClass = "selectRow"; 

    if (item.IsSelected) 
    { 
     rowClass = "success"; 
    } 


    <tr class="@rowClass"> 
     @Html.HiddenFor(m => m.Items[i].PropertyOne) 
     <td> 
      @Html.DisplayFor(m => m.Items[i].PropertyTwo) 
     </td> 
     <td class="actions"> 
      // only those items not previously selected need a radio button 
      @if (item.IsSelected == false) 
      { 
       @Html.RadioButtonFor(m => m.Items[i].IsSelected, m.Items[i].PropertyOne, new { id = "IsSelected_" + m.Items[i].PropertyOne }) 
      } 
     </td> 
    </tr> 
} 

我已經使用@ Html.HiddenFor(X => x.PropertyOne)嘗試,但我不能選擇的值的集合結合回到模型。我可以使用隱藏字段返回模型中的所有其他內容,但我不知道如何解決此問題。任何幫助表示讚賞。

感謝

+0

找出這裏發生了什麼的最好方法是查看發佈時線路上有哪些Model.Items。你使用過提琴手嗎? http://www.telerik.com/fiddler。還是FireBug? –

回答

2

如果你想收藏正確張貼到模型綁定,您不能使用foreach循環(除非您使用EditorFor,見註釋)。你必須使用一個好的老式for循環,並從IList派生你的收藏。查看我的問題和答案here瞭解更多信息。

此外,您要發佈的集合對象類型的任何屬性,您需要確保它在循環中使用。所以,說你Item類看起來是這樣的:

public class Item 
{ 
    public int ItemId { get; set; } 
    public string ItemDescription { get; set; } 
    public bool IsSelected { get; set; } 
} 

...你的循環可能是這樣的:

@for(var i = 0;i < Model.Items.Count; i++) 
{ 
    <tr> 
     @Html.HiddenFor(m => Model.Items[i].ItemId) 
     <td> 
      @Html.TextBoxFor(m => Model.Items[i].Description) 
     </td> 
     <td> 
      @Html.CheckBoxFor(m => Model.Items[i].IsSelected) 
     </td> 
    </tr> 
} 

同樣重要的是要注意,只是顯示模型屬性不會後它。意思是說......

@Model.Items[i].Description 

...將不會發布,但掩藏它或HTML元素使用它......

@Html.HiddenFor(m => Model.Items[i].Description) 

將發佈並正確綁定。

從菲爾哈克關於這個問題的權威性文章之一可以找到here

+0

我已經看過這個,但當我將foreach更改爲for循環時,無法提交視圖。 – crunchy

+0

查看我的編輯,並將您的原始問題中的for循環修改後的代碼作爲編輯發佈,以便我們可以看到您擁有的內容。 –

+1

嗨@AJ,你的回答是正確的。有一件事是它不必使用'for',你仍然可以使用foreach。看看這個鏈接:http://stackoverflow.com/questions/20842935/asp-net-mvc-complex-model-updating/20843172#20843172 – Lin