これらのテクニックの結果は同じになるので、ほとんどの場合、チームがより快適に感じるかどうかの問題です。だからあなたはあなたが述べたような慣習を思い付くことができます。
個人的には、そのモデルを使用するすべてのアクションメソッドに属性を設定する必要はありません。したがって、次のいずれかのオプションを選択します。
次のようにモデルクラスに属性を設定します。
[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を使用していると仮定します)
アクションのパラメーターの属性。ControllerActionInvokerクラスのGetParameterValueメソッドを参照してください
IModelBinderProviderから返されたバインダー。ModelBinderDictionaryクラスのGetBinderメソッドを参照してください
ModelBinders.Bindersディクショナリにグローバルに登録されているバインダー。
[ModelBinder()]
モデルタイプの属性で定義されたバインダー。
DefaultModelBinder。