0

モノレールで実行され、Castle ActiveRecord / NHibernateを使用しているショッピングカートアプリケーションがあり、エンティティにマップされているShoppingCartテーブルとShoppingCartItemsテーブルがあります。

シナリオは次のとおりです。ユーザーがショッピングカートに物を追加し、たとえば5つのアイテムを追加して、カートを表示します。カートには5つのアイテムがすべて表示されます。ユーザーはタブ/ウィンドウを複製し、同じカートの別のタブを取得します(タブBと呼びます)。ユーザーがカートからアイテムを削除したため、タブBには4つのアイテムがありますが、元のタブAにはまだ5つのアイテムがあります。ユーザーはタブAに戻り、カート内の何かを更新し、変更を送信する[更新]ボタンをクリックします。私のMonoRailアクションは、5つのアイテムすべてを含むビューのデータを使用して、ShoppingCartItemsに対してARDataBindを実行しようとします。ユーザーがタブBから削除したアイテムに到達すると、そのアイテムに対して「指定された識別子の行は存在しません」をスローします。

その行をバインドしない、nullを返す、新しいインスタンスを返すなどの方法があるかどうかわかりませんか?ARDataBind属性にAutoLoadBehaviorパラメーターがありますが、これは子エンティティのロードにのみ影響し、ルートエンティティには影響しないようです。選択したオプションに関係なく、コントロールがアクションメソッドに入る前に例外が発生します(AutoLoadBehavior.Neverを除くが、それは実際には役に立ちません)。

代わりに、Request.ObtainParamsNode()を呼び出してフォームノードをプルし、それらを手動でオブジェクトに解析し、存在しなくなったものを無視するコードがあります。もっと良い方法はありますか?

ありがとう。

4

1 に答える 1

1

ARDataBinderを継承し、オーバーライドしますFindByPrimaryKey(Type targetType, object id)

protected override object FindByPrimaryKey(Type targetType, object id) {
  return FindByPrimaryKey(targetType, id, false);
}

ここで重要なのはfalseパラメータであり、これにより、スローする代わりにnullが返されます。

次に、 ARDataBindAttributeを継承し、CreateBinder()メソッドをオーバーライドして、デフォルトのARDataBinderの代わりに新しいバインダーを返すようにします。

次に、ARDataBindAttributeの代わりにカスタムバインダー属性を適用します。

于 2010-03-20T22:09:20.903 に答える