25

[ModelBinder()]誰かが、global.asaxを介して属性を使用することとモデルバインダーを登録することの長所/短所を教えてもらえModelBinders.Add()ますか?

私が考えることができる1つの利点は、それがより明確であるのに対し、グローバルに登録することはModelBinders、アクションメソッドを検査する誰かにとってそれほど明白ではないということです。

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

これが唯一の違いですか?

言い換えれば、これは正しいと言えますか?

  • モデルを1つのアクションメソッド(おそらく2つ、get + post)でのみ使用する場合は、を使用します[ModelBinder()]
  • モデルを複数のアクションメソッドで使用する場合は、グローバルに登録してModelBindersください。
4

2 に答える 2

33

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

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

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

    [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インターフェイスを実装し、次のようにglobal.asaxに登録することで、モデルバインダーを選択するための独自のロジックを実装するオプションもあります。

ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider()) 

メソッドパラメータで属性を使用する1つの方法は、その特定のメソッドに対して、他の方法で使用されるモデルバインダーをオーバーライドすることです。したがって、クラスのモデルバインダーをグローバルに登録し、属性を使用して1つの特定のアクションメソッドでオーバーライドできます。

結局、モデルバインダーを選択するためのかなりの数のオプションがあります。asp MVC 3では、これは次の方法で解決されます(デフォルトのControllerActionInvokerを使用していると仮定します)

  1. アクションのパラメーターの属性。ControllerActionInvokerクラスのGetParameterValueメソッドを参照してください

  2. IModelBinderProviderから返されたバインダー。ModelBinderDictionaryクラスのGetBinderメソッドを参照してください

  3. ModelBinders.Bindersディクショナリにグローバルに登録されているバインダー。

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

  5. DefaultModelBinder。

于 2012-12-06T17:27:08.613 に答える
1

Global.asaxのモデルバインダーコレクションに追加するのではなく属性を使用する利点は、バインダーを特定のタイプに関連付けるのではなく、使用する特定のバインダーをメソッド(またはクラス)に指示できることです。次に、タイプではなくコンテキストに基づいてモデルを作成できます。

于 2014-09-09T15:46:27.817 に答える