2009-07-09 12 views
5

私はそれがこれをレンダリングしているDinnerForm.ascxASP.Net MVCのモデルバインダと親/子レコードの更新

<p> 
    <%int i = 0; 
    foreach (NerdDinner.Models.RSVP rsvp in this.Model.Dinner.RSVPs) 
     { %> 

     <%= Html.Hidden("Dinner.RSVPs[" + i + "].RsvpID", rsvp.RsvpID)%> 
     <%= Html.Hidden("Dinner.RSVPs[" + i + "].DinnerID", rsvp.DinnerID)%> 
     <%= Html.TextBox("Dinner.RSVPs[" + i + "].AttendeeName", rsvp.AttendeeName)%> 
    <% i += 1; 
    } %> 
    </p> 

を次のコードを追加することにより、子レコードの編集を許可するNerd Dinnerアプリケーションを変更しました:

<p> 
    <input id="Dinner_RSVPs[0]_RsvpID" name="Dinner.RSVPs[0].RsvpID" type="hidden" value="36" /> 
     <input id="Dinner_RSVPs[0]_DinnerID" name="Dinner.RSVPs[0].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[0]_AttendeeName" name="Dinner.RSVPs[0].AttendeeName" type="text" value="kp" /> 
    <input id="Dinner_RSVPs[1]_RsvpID" name="Dinner.RSVPs[1].RsvpID" type="hidden" value="37" /> 
     <input id="Dinner_RSVPs[1]_DinnerID" name="Dinner.RSVPs[1].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[1]_AttendeeName" name="Dinner.RSVPs[1].AttendeeName" type="text" value="jim" /> 

    </p> 

私はDinnersControlerの投稿編集アクションメソッドを変更していません。 Parentディナーはいつものように更新されていますが、UpdateModel(夕食)と表示されます。子RSVPレコードを参照/更新していません。

Modelバインダーがコレクションを見て、運がないように、子レコードをレンダリングする際にいくつかのバリエーションを試しました。

UpdateModel(Parent)を呼び出して親/子レコードをワンショットで更新しています。現在のモデルバインダーで可能ですか?

答えて

4

私はこれを自分で行うことができませんでした。

私はあなたが1つの子要素、すなわちDinner.RSVを自動的に更新できることを知っています。私は子供の列挙型を更新する機能を見たことがありません。これは、どのプロパティがIDであるかを知るバインディングが必要です(つまり、Dinner.RSVP.Where(r => r.RSVP_ID == input_id)。それを更新する)。そのようなことをするカスタムバインディングについては十分に分かりません。

しかし、私が行っていることはループを行うと、プレフィックスとして、RSVPとint型を指定することです:

だから、あなたは:

UpdateModel("Dinner", Dinner); 

親を更新してからする:

int i = 0; 

foreach (var r in Dinner.RSVPs) { 
    UpdateModel(r, "Dinner.RSVPs[" + i++ + "]"); 
} 

きれいではありませんが、うまく機能します。ただし、すべてを同時に検証し、最初のRSVPのビューにエラーが戻っていないことを確認したい場合は、検証を組み込むためにもう少し努力する必要があります。

EDIT:パラメータの順序のバグを含む、OPのソリューションを反映するコードが修正されました。それが言われると、私は、実行中の整数よりもRSVP.IDプロパティを使用するほうが快適です。あなたがDinner.RSVPがGETと同じPOSTになることを知っている限り(私は自分のコードでこれを確信しています)、RSVP.IDを使用すると動作します。 RSVPが異なる場合は、両方に存在するものだけが更新されます。ただし、シーケンシャルintを使用すると、間違ったオブジェクトが更新される可能性があります。助け

希望、 ジェームズ

+0

@jamesshannonこの回答は近いです。更新モデルをループ内で修正して int i = 0; foreach(RSVP r in Dinner.RSVPs){ UpdateModel(r、 "Dinner.RSVPs [" + i + "]"); i ++; } と記されています。 –

0

だから、誰も答えていません。私はnerddinnerアプリを知らないが、あなたの問題に興味があった。いくつかの答えを見たいと思っていたが、まあ、誰もまだ答えていない。 ndinnerに精通していないために100%確実ではありませんが、プロパティが明示的に渡された場合にのみバインド/更新を指摘するthis postに関連する可能性がありますか?

0

あなたの質問であるのUpdateModel(親)を呼び出すことにより、ワンショットで親/子レコードを更新するかどうか。現在のモデルバインダーで可能ですか?

はい、可能です。ただし、IList<T>の代わりにEntitySet<T>によってあなたの子オブジェクトが公開されていて、Linq-to-Sqlを使用している場合はではありません(軽微な回避策はありません)。私はこれがASP.NET 4.0で予定されているMVCの次期バージョンで対処されると考えています。 MVCのデフォルトモデルバインダーは当面、EntitySetの操作方法を理解していないようです。

これを参照してくださいother answer私は今、特定の単純なケースでこの状況をどのように処理しているかについての詳細について、以前に関連する質問に書いています。これを行うにあたり、私は、このソリューションがDDD/OOPの観点から「理想的」であることを心配する必要がなくなりました.MVCとLTSを最小限の労力でうまく組み合わせるというトレードオフです。

James Sの解決策はおそらくもっと純粋ですが、私が尋ねると「ワンショット」でこれを行うには、ASP.NET 4.0を待つか、あなたが私の他の投稿で見つけることに類似した回避策。

幸運を祈る!

関連する問題