【问题标题】:DotNet MVC bind list of complex objects containings lists包含列表的复杂对象的 DotNet MVC 绑定列表
【发布时间】:2016-12-29 15:15:01
【问题描述】:

我有两个类,第一个包含一个列表。 VIEW 接收一个 List 作为模型。 当我发布视图时,我可以在控制器中检索每个简单的属性。但子模型的 List 始终为空。

两个类:

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

【问题讨论】:

  • 请向我们展示您的控制器和此请求管道中的任何其他代码。
  • 没有看到控制器很难分辨。但我相信您不能将复杂类型传递回控制器,因为它通常会导致 null。据说这是因为查询字符串可能太长以及其他各种原因

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


【解决方案1】:

很遗憾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 :(
  • 没关系。对于可编辑字段,使用 EditorFor 或 TextBoxFor 而不是 HiddenFor - 基本上是任何生成输入元素的东西。
【解决方案2】:

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

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

(如果这不能解决问题,则问题很可能出在您的控制器中,您应该发布该问题以排除其他可能性。)

【讨论】:

    【解决方案3】:

    答案是:为包含 List 的类的每个属性创建一个 EditorFor 模板,以便能够将其放入控制器中。

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

    【讨论】:

    • 你能更详细地描述一下吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多