5

我有以下内容:

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

4

1 回答 1

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 中,一切都按照约定进行。所以在这个例子中,我假设它Parents是一个IEnumerable<Parent>并且Children是一个IEnumerable<Child>。相应地调整模板的名称。

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

于 2013-03-05T21:59:47.023 回答