3

我被这个非常奇怪的问题困住了。
我有一个名为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 方法中可以看出,我有一个自定义ModelBinder名称AttendenceRegistrationModelBinder,这是代码

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

我在这里做错了什么?

4

1 回答 1

11

您遇到的问题是您使用的是 MVC 模型绑定器而不是 WebApi。看起来您是从System.Web.Mvc.DefaultModelBinderwhich implements派生的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

您是否考虑过为您的 Json 表单字段使用JToken ,这可能在没有自定义活页夹的情况下工作。

于 2012-12-11T10:00:18.333 回答