Как вызвать привязку модели по умолчанию из пользовательского связывателя в WebAPI?

У меня есть пользовательское связывание модели в WebAPI, в котором используется следующий метод из пространства имен `Sytem.Web.Http.ModelBinding', которое является правильным пространством имен для создания настраиваемых связывателей модели для веб-API:

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{

}

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

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

base.BindModel(controllerContext, bindingContext);

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

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


person atconway    schedule 08.04.2016    source источник
comment
Я понимаю, что это произошло несколько лет спустя, но мне было интересно, нашли ли вы когда-нибудь решение этой проблемы? Я столкнулся с той же проблемой сейчас. @atconway   -  person markf78    schedule 26.07.2021


Ответы (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....
    }
}
person Shazwazza    schedule 05.08.2016
comment
Я пытаюсь выяснить, как исключить существующий MyModelBinder из простого вызова самого себя, поскольку он является связующим по умолчанию для MyModel. - person Evan Morrison; 18.10.2018
comment
Вы когда-нибудь находили решение для этого? - person ntziolis; 26.06.2020
comment
ты @ntziolis? - person markf78; 26.07.2021