【问题标题】:How can I edit child objects in an MVC4 form?如何在 MVC4 表单中编辑子对象?
【发布时间】:2013-02-20 12:14:19
【问题描述】:

我有以下几点:

@foreach (var parent in Model.Parents)
{      
    @foreach (var child in parent.Children)
    {    
        @Html.TextAreaFor(c => child.name)    
    }                   
}

如何让编辑对子对象起作用?我也尝试过这样的事情:

<input type="hidden" name="children.Index" value="@child.Id" />
<textarea name="children[@child.Id]" >@child.Name</textarea>

将 IDictionary 传递给控制器​​,但出现错误:

[InvalidCastException: Specified cast is not valid.]
   System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary, IEnumerable`1 newContents) +131

这似乎是一项非常常见的任务...有没有简单的解决方案?我错过了什么?我需要使用编辑器模板吗?如果是这样,任何与 MVC4 兼容的示例都会很棒。

【问题讨论】:

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


    【解决方案1】:

    有没有简单的解决方案?

    是的。

    我错过了什么?

    编辑器模板。

    我需要使用编辑器模板吗?

    是的。

    如果是这样,任何与 MVC4 兼容的示例都会很棒。

    ASP.NET MVC 4?伙计,从 ASP.NET MVC 2 开始就存在编辑器模板。您需要做的就是使用它们。

    因此,首先摆脱外部foreach 循环并将其替换为:

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

    然后显然定义一个编辑器模板,该模板将为Parents集合(~/Views/Shared/EditorTemplates/Parent.cshtml)的每个元素自动呈现:

    @model Parent
    @Html.EditorFor(x => x.Children)
    

    然后是 Children 集合 (~/Views/Shared/Editortemplates/Child.cshtml) 的每个元素的编辑器模板,我们将在其中删除内部的 foreach 元素:

    @model Child
    @Html.TextAreaFor(x => x.name)
    

    在 ASP.NET MVC 中,一切都按照约定进行。所以在这个例子中,我假设ParentsIEnumerable&lt;Parent&gt;ChildrenIEnumerable&lt;Child&gt;。相应地调整模板的名称。

    结论:每次在 ASP.NET MVC 视图中使用 foreachfor 时,您都做错了,您应该考虑摆脱它并用编辑器/显示模板替换它。

    【讨论】:

    • 谢谢达林。我现在正在使用模板,它们很摇滚。干杯!
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2011-06-08
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多