Ошибка 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();
}
}
Обратите внимание на разные, я надеюсь, что это поможет вам