2013-09-28 2 views
7

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

Ошибка:

Может не создать " 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; } 
} 
+0

аналогичный вопрос: http://stackoverflow.com/questions/9910346/mvc-4-modelbinder – shankbond

ответ

15

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

Вы пытаетесь реализовать модель интерфейса System.Web.Mvc.IModelBinder связующих в MVC, но для работы с 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 
    } 
} 

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

+0

Спасибо! он решил это, но теперь я не могу использовать DefaultModelBinder, и поэтому я не могу отказаться от привязки к связующему по умолчанию, вызвав base.BindModel(). У меня есть модель пользователя, которая имеет список , а затем она терпит неудачу, так как пользователь не имеет тип (соединение). у вас есть идея? –

+0

ModelBinders работают по-разному в web.api. Так что в web.api нет 'DefaultModelBinder' ... и обычно при использовании сети.api существуют другие способы решения таких проблем, поэтому вы должны начать с связанных статей ... – nemesv

+0

спасибо, я читаю эти статьи. Чувство немного странное, что для использования реализации по умолчанию мне нужно сделать тонну логики, используя встроенные MediaFormatters и/или ComplexModelBinder. –

0

Это для использования 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(); 
    } 
} 

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

Смежные вопросы