2011-08-12 3 views
1

私はカスタムモデルバインダーをしたと私は私のアクションメソッドにこれを割り当てるの二つの方法を知っている:コントローラ全体にカスタムModelBinderを設定することはできますか?

いずれかの方法で:global.asax.csで

public ActionResult MyAction([ModelBinder(typeof(MyCustomModelBinder))] ModelClass filter 

またはグローバル:

ModelBinders.Binders.Add(typeof(MyCustomModelBinder)) 

しかし、カスタムモデルのバインダーをコントローラに割り当てる方法があるのだろうか?したがって、コントローラ内のすべてのメソッドで動作しますが、グローバルには動作しません。

答えて

1

モデルバインダーでは、ControllerContextにアクセスできます。したがって、そこで使用可能なコントローラ情報に基づいてモデルをバインドするのは簡単です。

モデルバインディングとコントローラの間にカップリングを作成するため、少し匂いがします。しかし、DIを使用して戦略パターンを作成し、ModelBinderContainerにバインダーリゾルバを挿入し、システムの知識を使って目的のバインディングを選択すると、ソリューションが得られます。

0

ModelBinderはModelBinderがBindersコレクション内でグローバルに(またはモデルクラスに直接属性を追加することによって)モデルにバインドされているため、論理的には意味がありませんアクションで。

PostSharpのようなツールを使用して、アスペクト(アスペクト指向プログラミングの場合のように)を作成することで、あなたが望むものを達成することはできます。コントローラのレベルでそのアスペクトを適用することができ、すべてのメソッドにModelBinder属性をポストコンパイルのステップとして注入します。問題は、あなたがこのすべてのトラブルを通過したいかどうかです。さらに重要なことは、それが何らかの価値をもたらすかどうかです。

属性デコレータアスペクトis available in the PostSharp documentation hereの例。

関連する問題