2016-12-29 94 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 <>的类的属性能够将其获取到控制器中。

谢谢大家的帮助,因为你们有些人给了我想法。