5

所以似乎有几个人(比如这里这里)对 ApiControllers 的MVC4 模型绑定有问题,但他们似乎都没有完全解决我看到的问题。

我真正想做的就是更改整数列表的数组绑定行为。所以说我有一个这样的请求类型:

public class MyRequestModel
{
    public List<long> ListOfIntegers { get; set; }

    ...
}

还有一个像这样的 API GET 方法:

public ResultsResponseModel Get(MyRequestModel request)
{
    // use request.ListOfIntegers meaningfully

    ...

    return response;
}

我基本上希望能够说出/api/results/?listOfIntegers=1+2+3+4+5并对List<long>财产有这样的决心。

我已经尝试过我常用的模型绑定技巧,但与MVC4 中的大多数 Web API 一样,它似乎有一个完全独立的模型绑定路径。

我得到的最远的是使用System.Web.Http.ModelBinding.ModelBinder属性MyRequestModel,并创建一个“实现”的模型绑定器System.Web.Http.ModelBinding.IModelBinder。这始终会产生一个对象引用异常,其堆栈跟踪从未触及我的代码。

有人打这个吗?对下一步要尝试什么有想法?

更新:这是我在自定义中捕获的堆栈跟踪ExceptionFilterAttribute

Object reference not set to an instance of an object.
    at System.Web.Http.ModelBinding.DefaultActionValueBinder.BindParameterValue(HttpActionContext actionContext, HttpParameterBinding parameterBinding)
    at System.Web.Http.ModelBinding.DefaultActionValueBinder.<>c__DisplayClass1.BindValuesAsync>b__0(RequestContentReadKind contentReadKind)
    at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass38.<ToAsyncVoidTask>b__37()
    at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
4

1 回答 1

4

如果您在谈论 ApiControllers,那么您正在尝试在 Web API 和现在 MVC 中进行模型绑定 这是一个示例模型绑定器

  public class MyRequestModelBinderProvider : ModelBinderProvider
    {
        MyRequestModelBinder binder = new MyRequestModelBinder();
        public IdeaModelBinderProvider()
        {          
        }

        public override IModelBinder GetBinder(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.ModelType == typeof(MyRequestModel))
            {
                return binder;
            }

            return null;
        }
    } 

这是注册自定义模型绑定器提供程序的示例

 IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider));
 List<Object> services = new List<object>(modelBinderProviderServices);
 services.Add(new MyRequestModelBinderProvider());
 GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());

现在在您的自定义模型绑定器中,您使用上下文来访问查询字符串值

  public class MyRequestModelBinder :  IModelBinder
    {
        public MyRequestModelBinder()
        {

        }

        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            MyRequestModel yourModel; 
            //use contexts to access query string values
            //create / update your model properties

            bindingContext.Model = yourModel;  
            //return true || false if binding is successful
        }

确保您使用 WebAPI 而不是 MVC 的类和接口。有些名称相同,但命名空间和 dll 不同

于 2012-04-11T03:48:01.193 回答