2016-12-29 117 views
1

我有兩個類,第一個包含一個List。 VIEW作爲模型接收列表。 當我發佈視圖時,我可以在控制器中檢索每個簡單屬性。但列表<>對於子模型始終爲空。DotNet MVC包含列表的複雜對象的綁定列表

這兩個類:

public class MyModel 
{ 
    public int ModelId {get;set;} 
    public string Description {get;set;} 
    public List<SubModel> SubModels {get;set;} 
} 

public class SubModel 
{ 
    public int MySubModelId {get;set;} 
    public string Description {get;set;} 
} 

在視圖頁面收到該模型

@model List<MyModel> 

繼互聯網上的建議,我創造了一個editorfor編輯器渲染視圖我的課:

@model MyModel 
<tr id="@Model.ModelId"> 
    @Html.HiddenFor(m => m.ModelId) 
    @Html.HiddenFor(m => m.Description) 

    <td>@Model.Description</td> 
</tr> 

@for(int i = 0; i < Model.SubModels.Count; i++) 
{ 
    // How to render the class here to be able to be post in the controller? 
    // @Html.HiddenFor(m => m.SubModels[i]) will not work of course... 
} 
+0

請向我們展示您的控制器以及此請求管道中的任何其他代碼。 –

+0

沒有看到控制器,很難說。但我相信你不能將複雜的類型傳遞迴控制器,因爲它通常會導致null。據推測,這是因爲查詢字符串可能由於其他各種原因而過長 – 2016-12-29 15:21:29

回答

0

不幸的是HiddenFor不能遞歸地行動,但y OU可以自己動手完成它:

@for (int i = 0; i < Model.SubModels.Count; i++) 
{ 
    // postback everything 
    @Html.HiddenFor(m => m.SubModels[i].MySubModelId) 
    @Html.HiddenFor(m => m.SubModels[i].Description) 
} 

剛回發MySubModelId爲每一個子就足以防止Model.SubModels被空。

通常我只是回發ID,重新加載操作方法中的所有其他內容。

+0

問題是我需要來自此子模型的信息,它將由用戶修改。所以我不能保存ID: – Eagle

+0

這很好。對於可編輯的字段,使用EditorFor或TextBoxFor而不是HiddenFor - 基本上任何生成輸入元素的東西。 – buffjape

0

只要您隱藏了主模型的ID,您還需要隱藏每個子模型的ID。否則,程序無法跟蹤它們。在for循環中包含隱藏字段以涵蓋每個子模型。

@Html.HiddenFor(m => m.SubModels[i].MySubModelId) 

(如果這不能解決問題,問題很可能出在你的控制器,你應該張貼到敲定其他的可能性。)

0

答案是:創造每一個EditorFor模板包含List <>的類的屬性能夠將其獲取到控制器中。

謝謝大家的幫助,因爲你們有些人給了我想法。