Ошибка WebAPI ModelBinder

Я реализовал ModelBinder но это BindModel() метод не вызывается, и я получаю код ошибки 500 со следующим сообщением:

Ошибка:

Не удалось создать IModelBinder из MyModelBinder. Убедитесь, что он получен из IModelBinder и имеет открытый конструктор без параметров.

Я наследую от IModelBinder и у меня есть открытый конструктор без параметров.

Мой код ModelBinder:

public class MyModelBinder : IModelBinder
    {
        public MyModelBinder()
        {

        }
        public bool BindModel(ModelBindingExecutionContext modelBindingExecutionContext, ModelBindingContext bindingContext)
        {
            // Implementation
        }
    }

Добавлено в Global.asax:

protected void Application_Start(object sender, EventArgs e)
{
    ModelBinders.Binders.DefaultBinder = new MyModelBinder();

    // ...
}

Подпись действия WebAPI:

    [ActionName("register")]
    public HttpResponseMessage PostRegister([ModelBinder(BinderType = typeof(MyModelBinder))]User user)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }

Класс пользователя:

public class User
{
    public List<Communication> Communications { get; set; }
}

2 ответа

Решение

ASP.NET Web API использует совершенно другую структуру ModelBinding, чем APS.NET MVC.

Вы пытаетесь реализовать интерфейс связывания модели MVC System.Web.Mvc.IModelBinder но для работы с Web API нужно реализовать System.Web.Http.ModelBinding.IModelBinder

Итак, ваша реализация должна выглядеть так:

public class MyModelBinder : System.Web.Http.ModelBinding.IModelBinder
{
    public MyModelBinder()
    {

    }

    public bool BindModel(
        System.Web.Http.Controllers.HttpActionContext actionContext, 
        System.Web.Http.ModelBinding.ModelBindingContext bindingContext)
    {
        // Implementation
    }
}

Для дальнейшего чтения:

Это для использования System.Web.ModelBinding

 using System.Web.ModelBinding;
class clsUserRegModelBinder : IModelBinder
{
   public bool BindModel(ModelBindingExecutionContext modelBindingExecutionContext, ModelBindingContext bindingContext)
   {
        throw new NotImplementedException();
   }
}

Это для System.Web.MVC

using System.Web.Mvc;


class clsUserRegModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,     ModelBindingContext bindingContext)
    {
        throw new NotImplementedException();
    }
}

Обратите внимание на разные, я надеюсь, что это поможет вам

Другие вопросы по тегам