我有两个类,第一个包含一个列表。该视图将列表作为模型接收。当我发布视图时,我可以在每个简单属性的控制器中检索。但是列表<>始终为子模型。
两个类:
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;>类的每个属性创建一个编辑模板,以便能够将其放入控制器中。
谢谢大家的帮助,因为你们中的一些人给了我想法。