Как вызвать привязку модели по умолчанию из пользовательского связующего в WebAPI?
У меня есть пользовательское связывание модели в WebAPI, которое использует следующий метод из пространства имен `Sytem.Web.Http.ModelBinding', которое является правильным пространством имен для создания пользовательских связывателей моделей для Web API:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
}
у меня есть HTTP POST
на контроллере, для которого я хочу использовать эту пользовательскую модель связующего. Размещенный объект содержит около 100 полей. Я хочу изменить 2 из них. Мне нужно, чтобы привязка модели по умолчанию происходила, а затем манипулировала объектом, привязанным к модели, для этих двух полей, чтобы после того, как контроллер получил объект, он был нетронутым.
Проблема в том, что я не могу связать модель с моим объектом, используя привязку по умолчанию из метода привязки модели выше. В MVC
было следующее:
base.BindModel(controllerContext, bindingContext);
Этот же подход не работает в WebAPI. Может быть, я ошибаюсь, и есть другой способ выполнить то, что я хочу, поэтому, пожалуйста, предложите, если привязка к пользовательской модели не является правильным подходом. То, что я пытаюсь предотвратить, это манипулирование размещенным объектом внутри контроллера. Технически я мог бы сделать это после того, как он был привязан к модели, но я пытаюсь сделать это раньше в стеке вызовов, чтобы контроллеру не приходилось беспокоиться о пользовательских манипуляциях с этими двумя полями.
Как я могу инициировать привязку модели по умолчанию к bindingContext
в моем пользовательском связывателе модели, чтобы у меня был полностью заполненный объект, где я мог бы просто манипулировать / массировать последние 2 поля, которые мне нужны, перед возвратом?
1 ответ
В WebApi связыватель модели "по умолчанию" CompositeModelBinder
которая оборачивает все зарегистрированные модельные связующие. Если вы хотите повторно использовать его функциональность, вы можете сделать что-то вроде:
public class MyModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(MyModel)) return false;
//this is the default webapi model binder provider
var provider = new CompositeModelBinderProvider(actionContext.ControllerContext.Configuration.Services.GetModelBinderProviders());
//the default webapi model binder
var binder = provider.GetBinder(actionContext.ControllerContext.Configuration, typeof(MyModel));
//let the default binder do it's thing
var result = binder.BindModel(actionContext, bindingContext);
if (result == false) return false;
//TODO: continue with your own binding logic....
}
}