これらのテクニックの結果は同じになるので、チームがより快適に感じるものがほとんどです。だから、あなたが述べたような大会を思いつくことができます。
個人的には、そのモデルを使用するすべてのアクションメソッドで属性を設定する必要はありません。だから私は、次のいずれかのオプションを選択します:
はモデルクラスの属性のように設定します。
[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では
アクションのパラメータの属性(デフォルトControllerActionInvokerを使用していると仮定)。ControllerActionInvoker classのGetParameterValueメソッドを参照してください。
IModelBinderProviderから返されたバインダー。 ModelBinderDictionary class
ModelBinders.Binders辞書にグローバルに登録されているバインダー。
モデルタイプの[ModelBinder()]
属性で定義されたバインダー。
DefaultModelBinder。これは、属性を使用してではなく、Global.asaxの中のモデルバインダーコレクションに追加することの利点のように私には見えます
DefaultModelBinderは、ModelBinders.Binders.DefaultBinder = new TestBinder();のデバッグに便利です。 – Todd