3

У меня есть пользовательские модели связующего в WebAPI, который использует следующий метод из `имен Sytem.Web.Http.ModelBinding», который является правильное пространство имен для создания пользовательских моделей связующих для Web API:Как вызвать функцию привязки модели по умолчанию из пользовательского связующего в WebAPI?

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
{ 

} 

У меня есть HTTP POST на контроллере, для которого я хочу использовать это настраиваемое связующее устройство. Опубликованный объект содержит около 100 полей. Я хочу изменить 2 из них. Мне нужно, чтобы привязка модели по умолчанию выполнялась, а затем манипулировать объектом этой модели для этих 2 полей, чтобы после того, как контроллер получил объект, он является нетронутым.

Проблема заключается в том, что я не могу моделировать связывание своего объекта с использованием связующего по умолчанию из метода привязки модели выше. В MVC было следующее:

base.BindModel(controllerContext, bindingContext);

Этот же подход не не работа в WebAPI. Возможно, я собираюсь сделать это неправильно, и есть еще один способ выполнить то, что я хочу, поэтому, пожалуйста, предложите, если нестандартное связывание модели не является правильным. То, что я пытаюсь предотвратить, - это манипулировать размещенным объектом внутри контроллера. Я мог бы технически сделать это после того, как он был привязан к модели, но я пытаюсь сделать это раньше в стеке вызовов, так что диспетчеру не нужно беспокоиться о пользовательской манипуляции этими двумя полями.

Как я могу инициировать привязку модели по умолчанию к bindingContext в моем подменю моей модели, чтобы у меня был полностью заполненный объект, где я могу просто манипулировать/массировать последние 2 поля, которые мне нужны, прежде чем возвращаться?

ответ

0

В 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.... 
    } 
} 
Смежные вопросы