【问题标题】:Html.EditorFor a child object in MVC4?Html.EditorFor MVC4 中的子对象?
【发布时间】:2013-03-05 20:36:09
【问题描述】:

我认为有以下代码:

@foreach (var parent in Model.Parents)
        {      
            @foreach (var child in parent.Children)
                { 

                 @Html.TextAreaFor(c => child.name)

                }                   
        }

表单中的其他文本区域保存得很好,但是当提交表单时,我的控制器中的 POST 方法会获取一个带有 null 父字段的 viewModel。知道为什么吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-4


    【解决方案1】:

    如果您希望集合绑定,则不能使用foreach 循环。你必须使用for 循环:

    @for (int i = 0; i < Model.Parents.Count; i++) {
        @for (int j = 0; j < Model.Parents[i].Children.Count; j++) {
            @Html.TextAreaFor(x => x.Parents[i].Children[j].name)
        }
    }
    

    或者,您可以为父母使用编辑器模板(甚至为儿童使用另一个编辑器模板)。这需要您为 Parent 模型设置一个模板并将其放入 EditorTemplates 文件夹中,然后像这样调用它:

    @Html.EditorFor(x => x.Parents)
    

    MVC 将负责枚举和绑定。然后可以对 Children 列表执行相同的操作。

    这是一个关于使用它们的 mvc 教程(我找不到 mvc4 版本):http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/

    【讨论】:

    • 谢谢西蒙。我收到一个错误,因为 Children 是一个 ICollection,而我的 viewModel 中只有父母。知道如何“列出”父母中的所有内容,或者以某种方式解决这个问题吗?
    • 要么更改为 IList,要么使用编辑器模板。编辑器模板适用于 IEnumerables。检查此答案以了解使用方法:stackoverflow.com/questions/4652457/…
    • 那我必须使用两个模板,对吧?一份给父母,一份给孩子?
    • 如果 Parents 是一个列表,你可以使用 for 循环,然后是 children 集合的编辑器。如果它们都是 ICollection 或 IEnumerable,则需要为每个使用一个编辑器模板。
    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 2013-02-20
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多