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>

按照互联网上的建议,我创建了一个编辑编辑器,以在视图中渲染我的班级:

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

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

只是您隐藏了主模型的ID的方式,您还需要为每个子模型隐藏ID。否则,该程序将无法跟踪它们。将隐藏的字段包括在循环中以覆盖每个子模型。

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

(如果这没有解决,则问题很可能在您的控制器中,您应该将其发布到其他可能性中。)

答案是:为包含列表&lt;>类的每个属性创建一个编辑模板,以便能够将其放入控制器中。

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

最新更新