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>と想定してChildrenIEnumerable<Child>ます。それに応じてテンプレートの名前を変更します。

結論: ASP.NET MVC ビューを使用foreachまたは使用するforたびに、間違ったことを行っているため、それを取り除き、エディター/表示テンプレートに置き換えることを検討する必要があります。

于 2013-03-05T21:59:47.023 に答える