5

次のコードをDinnerForm.ascxに追加して、子レコードを編集できるようにNerdDinnerアプリケーションを変更しました。

  <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>

これをレンダリングしています:

<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のPostEditActionメソッドを変更していません。親ディナーは通常どおり更新されますが、UpdateModel(dinner);のように見えます。子RSVPレコードを表示/更新していません。

モデルバインダーがコレクションを表示できるように、子レコードのレンダリングにいくつかのバリエーションを試しましたが、運がありません。

UpdateModel(Parent);を呼び出すことにより、親/子レコードを一度に更新しています。現在のモデルのバインダーで可能ですか?

4

3 に答える 3

4

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

単一の子要素、つまり 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 のビューに戻らないようにする必要があります)。

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

お役に立てば幸いです、ジェームズ

于 2009-07-09T14:04:38.540 に答える
0

あなたの質問は、UpdateModel(Parent); を呼び出して、親/子レコードをワンショットで更新するかどうかです。現行モデルのバインダーで可能ですか?

はい、可能です。ただし、Linq-to-Sql を使用していて、子オブジェクト. これは、ASP.NET 4.0 で予定されている MVC の次のバージョンで対処される (された?) と思います。ただし、当分の間、MVC の既定のモデル バインダーは、EntitySet の操作方法を理解していないようです。EntitySet<T>IList<T>

少し前に関連する質問に書いたこの他の回答を参照してください. これを行う際に、MVC と LTS を最小限の労力でうまく連携させることとのトレードオフとして、このソリューションが DDD/OOP の観点からどの程度「理想的」であるかについてあまり心配するのをやめなければなりませんでした。

James Sのソリューションはおそらくより「純粋」であることを認めますが、これを「ワンショット」で行うには、ASP.NET 4.0を待つか、次のような回避策を使用する必要がありますあなたが私の他の投稿で見つけるもの。

幸運を!

于 2009-09-22T00:01:15.230 に答える
0

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

于 2009-07-09T13:05:31.693 に答える