2013-03-05 7 views
5

私は、次のしている:MVC4フォームで子オブジェクトを編集するにはどうすればよいですか?

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

はどのようにして子オブジェクトのために働くために編集を得ることができますか?コントローラへのIDictionaryを渡すには

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

が、私はエラーを取得:私もこのような何かを試してみました

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

は、これは非常に一般的な作業のように思える...簡単な解決策はありこれに?私は何が欠けていますか?エディタテンプレートを使用する必要がありますか?もしそうなら、MVC4と互換性のある例は素晴らしいでしょう。

答えて

11

is there a simple solution to this?

はい。

What am I missing?

エディタテンプレート。

Do I need to use an Editor Template?

はい。

If so, any MVC4-compatible examples would be fantastic.

ASP.NET MVC 4? Man、ASP.NET MVC 2以来のエディタテンプレートが存在します。あなたがする必要があるのは、それらを使用することだけです。

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

、その後明らかにParents、コレクションの各要素(~/Views/Shared/EditorTemplates/Parent.cshtml)のために自動的にレンダリングされるエディタのテンプレートを定義します:

だから外foreachループを排除し、それを交換取得することから始め

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

し、我々は内側の0を取り除くでしょうChildrenコレクション(~/Views/Shared/Editortemplates/Child.cshtml)の各要素のエディタテンプレート要素:

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

すべてがASP.NET MVCで慣習的に機能します。したがって、この例では、ParentsIEnumerable<Parent>であり、ChildrenIEnumerable<Child>であると仮定します。それに応じてテンプレートの名前を変更します。

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

+0

ありがとうDarin。私は今テンプレートを使用しています。乾杯! – RobVious

関連する問題