3

私はこの非常に奇妙な問題で立ち往生しています。私は派生した
という名前のAPIコントローラーを持っています。これは ここから派生したコードですAttendanceControllerAPIControllerFAApiController

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


    }

しかし、フィドラーを使用してこのコントローラーにアクセスしようとすると。エラーが発生します

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

私はここで何が間違っているのですか?

4

1 に答える 1

11

あなたが抱えている問題は、WebApiではなくMVCモデルバインダーを使用していることです。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など)を見てください。

ここここにいくつかの有用なリソース。

JsonフォームフィールドにJTokenを使用することを検討しましたか?これはカスタムバインダーなしで機能する可能性があります。

于 2012-12-11T10:00:18.333 に答える