Как вызвать привязку модели по умолчанию из пользовательского связующего в 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....
    }
}
Другие вопросы по тегам