如何在MVC4 RC WebApi中注册自定义模型绑定器
我最近从MVC4 beta更新到RC,并遇到了一个WebApi项目的小问题。 我注意到的第一件事就是删除了ServiceResolver。 在删除之前,我使用它以下列方式注册自定义模型绑定程序提供程序:
IEnumerable modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider)); List services = new List(modelBinderProviderServices) { new CustomDynamicObjectModelBinderProvider() }; GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());
利用此模型绑定程序提供程序的操作具有以下签名:
[HttpPut] public void Put(CustomDynamicObject model)
我尝试用以下代码替换旧代码,但没有结果:
GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider());
当我尝试将数据PUT到给定的操作时,不调用模型提供程序的GetBinder方法,并且模型参数设置为null。 通过将Acion /方法的签名更改为以下内容,我能够使用ModelBinder属性使操作使用想要的模型绑定器
[HttpPut] public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model)
虽然这有效但我真的不想在我的所有控制器/动作中使用这种语法。
我想我应该提一下,我的模型绑定器提供程序inheritance自:
System.Web.Http.ModelBinding.ModelBinderProvider
我这样说是因为我看到以下命名空间中有另一个ModelBinderProvider类:
Microsoft.Web.Mvc.ModelBinding
回顾一下:如何在MVC4 RC WebApi中注册自定义模型绑定器?
自Beta以来,Web API中的模型绑定规则已发生变化。 Mike Stall的post中描述了新规则。 现在,只有在向参数显式添加ModelBinder
属性时,复杂类型的模型绑定才有效。
自Release Candidate以来,参数绑定机制再次发生了变化,因此您可能希望在进行太多更改之前等待RTM。 RC版本中还有其他几个选项可用 – 取决于您尝试绑定的数据的来源(查询字符串或请求正文)。
-
如果数据源是请求主体,那么您可以创建自定义
MediaTypeFormatter
而不是模型绑定器: -
如果您的数据来自查询字符串,并且您希望避免在参数上明确包含
[ModelBinder]
属性,那么您可以使用自定义TypeConverter
和自定义IValueProvider
。
在RTM版本(或当前的nightlies)中,如果其他选项不起作用,您将能够使用自定义HttpParameterBinding
。