2012-12-06 11 views
21

[ModelBinder()]属性を使用してモデルバインダーを登録することについての賛否両論は、global.asaxのModelBinders.Add()で教えてもらえますか?ModelBinder属性とModelBinders.Add()を使用する

私が考えることができる利点の1つは、より明示的ですが、グローバルに登録するとModelBindersは、アクションメソッドを検査している人には不利益ではありません。

このモデルバインダーを使用する必要があるすべてのアクションメソッドにこの属性を追加する必要があるため、グローバルに登録するとModelBindersはすべてのアクションメソッドで使用できるようになるため、この属性を再利用できないと考えることができますそのモデルを受け取る。

これは唯一の違いですか?言い換えれば

、これが正しいことを知らせるでしょう:

  • だけ[ModelBinder()]を使用し、その後、(多分2、+ポストを得る)1つのアクションメソッドでモデルを使用している場合。
  • 複数のアクションメソッドでモデルを使用する場合は、グローバルModelBindersに登録してください。

答えて

28

これらのテクニックの結果は同じになるので、チームがより快適に感じるものがほとんどです。だから、あなたが述べたような大会を思いつくことができます。

個人的には、そのモデルを使用するすべてのアクションメソッドで属性を設定する必要はありません。だから私は、次のいずれかのオプションを選択します:

  • はモデルクラスの属性のように設定します。

    [ModelBinder(typeof(MyModelBinder))] 
    public class MyModel 
    { 
        ... 
    }  
    
  • をグローバルバインダー

    ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder()) 
    

もう一つの理由を登録しますなぜ私はそれらのうちの1つを好むのですか?手動でモデルバインディングプロセスを起動する必要がある場合は、使用するウルカスタムモデルバインダー:

public ActionResult SomeActionMethod() 
{ 
    MyModel model = ... 

    //manually invoke the model binding process considering only query string data 
    //The custom model binder will be used only if it was globally registered 
    //in the binders dictionary or set in an attribute of the model class 
    TryUpdateModel(model, new QueryStringValueProvider()) 

    ... 
} 

また、インターフェースIModelBinderProviderを実装し、

ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider()) 

のようにGlobal.asaxの中で登録することにより、モデルバインダーを選択するための独自のロジックを実装するオプションがありますメソッドパラメータで属性を使用する1つの方法は、その特定のメソッドに対して、そうでなければ使用されるモデルバインダーをオーバーライドすることです。したがって、クラスのモデルバインダーをグローバルに登録し、その属性を使用して特定のアクションメソッドでオーバーライドすることができます。

最後に、モデルバインダーを選択するためのかなりのオプションがあります。これは次のように解決されるASP MVC 3では

  1. アクションのパラメータの属性(デフォルトControllerActionInvokerを使用していると仮定)。ControllerActionInvoker classのGetParameterValueメソッドを参照してください。

  2. IModelBinderProviderから返されたバインダー。 ModelBinderDictionary class

  3. ModelBinders.Binders辞書にグローバルに登録されているバインダー。

  4. モデルタイプの[ModelBinder()]属性で定義されたバインダー。

  5. DefaultModelBinder。これは、属性を使用してではなく、Global.asaxの中のモデルバインダーコレクションに追加することの利点のように私には見えます

+0

DefaultModelBinderは、ModelBinders.Binders.DefaultBinder = new TestBinder();のデバッグに便利です。 – Todd

0

はあなたが関連付けるのではなく、使用する特定のバインダーの方法(またはクラス)を伝えることができるということです特定のタイプのバインダー。次に、タイプではなくコンテキストに基づいてモデルを作成することができます。

関連する問題