如何编辑MVC4表单中的子对象?

时间:2013-03-05 21:54:55

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

我有以下内容:

@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的例子都会很棒。

1 个答案:

答案 0 :(得分:11)

  

有一个简单的解决方案吗?

  

我错过了什么?

编辑模板。

  

我是否需要使用编辑模板?

  

如果是这样,任何兼容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<Parent>ChildrenIEnumerable<Child>。相应地调整模板的名称。

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