DotNet MVC绑定包含列表的复杂对象列表

时间:2016-12-29 15:15:02

标签: c# asp.net-mvc list http-post model-binding

我有两个类,第一个包含List。 VIEW接收List作为模型。 当我发布视图时,我能够在控制器中检索每个简单属性。但列表<>对于SubModel,它始终为null。

这两个类:

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>

根据互联网上的建议,我创建了一个编辑器编辑器,以便在视图中呈现我的课程:

@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...
}

3 个答案:

答案 0 :(得分:0)

不幸的是HiddenFor不会递归,但您可以手动执行:

@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,重新加载动作方法中的其他所有内容。

答案 1 :(得分:0)

就像隐藏主模型的Id的方式一样,您还需要隐藏每个子模型的Id。否则程序无法跟踪它们。在for循环中包含隐藏字段以覆盖每个子模型。

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

(如果这不能解决问题,那么问题最有可能发生在您的控制器中,您应该发布该问题以解决其他可能性。)

答案 2 :(得分:0)

答案是:为包含List&lt;&gt;的类的每个属性创建一个EditorFor模板。能够将它带入控制器。

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