2012-12-10 30 views
3

我陷入了这个非常奇怪的问题。
我有名为AttendanceController的API控制器从APIControllerFA其inturn从ApiController
这里衍生衍生是代码在Asp.Net Web API中实现自定义模型绑定器时出错

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方法我有一个名为AttendenceRegistrationModelBinder定制ModelBinder指此是可见代码

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); 
     } 


    } 

,但是当我尝试访问使用提琴手该控制器。我得到一个错误说

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

我在这里做错了什么?

回答

11

您遇到的问题是您使用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

一些有用的资源herehere

你有没有考虑过使用JToken为你的Json表单字段,这可能没有一个自定义绑定工作。

+0

+1表示使用JToken的建议 –