Ошибка реализации пользовательского связывателя модели в веб-API Asp.Net

я столкнулся с этой очень странной проблемой.
у меня есть контроллер API с именем AttendanceController, производным от APIControllerFA, который, в свою очередь, является производным от ApiController
вот код

public class AttendanceController : ApiControllerFA
    {
        public HttpResponseMessage PostAttendance([ModelBinder(typeof(AttendanceRegistrationModelBinder))]AttendanceRegistrationModel model)
        {
            //checking model state for errors
            //throw new Exception("Just to throw an error ");

            ...........

Как видно из метода PostAttendance, у меня есть пользовательский ModelBinder с именем AttendenceRegistrationModelBinder, для которого это код

public class AttendanceRegistrationModelBinder :  DefaultModelBinder
    {

        protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.Name == "formJson")
            {
                string val = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name).AttemptedValue;
                dynamic jsonVal = JsonConvert.DeserializeObject(val);
                propertyDescriptor.SetValue(bindingContext.Model, jsonVal);
                return;
                //SetProperty(controllerContext, bindingContext,propertyDescriptor,jsonVal);
            }
            base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
        }


    }

но когда я пытаюсь получить доступ к этому контроллеру с помощью Fiddler. я получаю сообщение об ошибке

Could not create a 'IModelBinder' from 'AttendanceRegistrationModelBinder'. Please ensure it derives from 'IModelBinder' and has a public parameterless constructor

что я здесь делаю неправильно?


person Parv Sharma    schedule 10.12.2012    source источник


Ответы (1)


Проблема, с которой вы столкнулись, заключается в том, что вы используете привязку модели MVC, а не WebApi. Похоже, вы исходите из System.Web.Mvc.DefaultModelBinder, который реализует System.Web.Mvc.IModelBinder.

Чтобы создать настраиваемую привязку модели для WebApi, вам необходимо реализовать System.Web.Http.IModelBinder.

Взгляните на связыватели моделей, доступные в WebApi, например. CompsiteModelBinder http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f079d76e57b5#src%2fSystem.Web.Http%2fModelBinding%2fBinders%2fCompositeModelBinder.cs.

Некоторые полезные ресурсы здесь и здесь.

Рассматривали ли вы возможность использования JToken для поля формы Json, это может работать без специального связывателя.

person Mark Jones    schedule 11.12.2012