我被这个非常奇怪的问题困扰着。
我有一个名为AttendanceController
的API控制器,它派生自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方法中可以看到,我有一个名为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);
}
}
但是当我尝试使用Fiddler访问这个控制器时。我收到一个错误,说
Could not create a 'IModelBinder' from 'AttendanceRegistrationModelBinder'. Please ensure it derives from 'IModelBinder' and has a public parameterless constructor
我在这里做错了什么?
发布于 2012-12-11 18:00:18
您遇到的问题是您使用的是MVC模型绑定器,而不是WebApi。看起来你是从实现System.Web.Mvc.IModelBinder
的System.Web.Mvc.DefaultModelBinder
派生出来的。
要为WebApi创建自定义模型绑定器,您需要实现System.Web.Http.IModelBinder
。
看看WebApi中可用的模型绑定器,例如CompsiteModelBinder http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f079d76e57b5#src%2fSystem.Web.Http%2fModelBinding%2fBinders%2fCompositeModelBinder.cs。
一些有用的资源here和here。
你有没有考虑过为你的Json表单字段使用JToken,这可以在没有自定义绑定器的情况下工作。
https://stackoverflow.com/questions/13805915
复制相似问题