質問

MonoRail 上で実行され、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() を呼び出してフォーム ノードを取得し、それらを手動でオブジェクトに解析し、存在しないノードを無視するコードを用意しています。もっと良い方法はありますか?

ありがとう。

役に立ちましたか?

解決

継承する ARデータバインダー, 、オーバーライド FindByPrimaryKey(Type targetType, object id):

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

ここで重要なのは、 間違い これにより、スローする代わりに null が返されます。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top