Ну, я думаю, что один из способов сделать это - создать подкласс класса ModelBindersDictionary
и переопределить метод GetBinders (Type modelType, bool fallbackToDefault).
public class CustomModelBinderDictionary : ModelBinderDictionary
{
public override IModelBinder GetBinder(Type modelType, bool fallbackToDefault)
{
IModelBinder binder = base.GetBinder(modelType, false);
if (binder == null)
{
Type baseType = modelType.BaseType;
while (binder == null && baseType != typeof(object))
{
binder = base.GetBinder(baseType, false);
baseType = baseType.BaseType;
}
}
return binder ?? DefaultBinder;
}
}
В основном обходите иерархию классов, пока не будет найден механизм связывания моделей или по умолчанию не будет DefaultModelBinder
.
Следующим шагом является принятие фреймворка CustomModelBinderDictionary
. Насколько я могу судить, вам нужно выделить подкласс для следующих трех классов и переопределить свойство Binders: DefaultModelBinder
, ControllerActionInvoker
и Controller
. Возможно, вы захотите предоставить свой собственный класс CustomModelBinders
.
Отказ от ответственности : Это всего лишь грубый прототип. Я не уверен, что это на самом деле работает, какие последствия это может иметь или это разумный подход. Возможно, вы захотите загрузить код для самих фреймворков и поэкспериментировать.
Обновление
Полагаю, альтернативным решением было бы определить ваше собственное CustomModelBindingAttribute
.
public class BindToBase : CustomModelBinderAttribute
{
public override IModelBinder GetBinder()
{
return new BaseModelBinder();
}
}
public class CustomController
{
public ActionResult([BindToBase] Child child)
{
// Logic.
}
}