C# 如何在MVC4 RC WebApi中注册自定义modelbinder

C# 如何在MVC4 RC WebApi中注册自定义modelbinder,c#,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc 4,Asp.net Web Api,我最近从MVC4测试版升级到RC版,在一个WebApi项目中遇到了一个小问题。我注意到的第一件事是ServiceResolver被删除了。在删除之前,我使用它以以下方式注册自定义模型绑定器提供程序: IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider)); Li

我最近从MVC4测试版升级到RC版,在一个WebApi项目中遇到了一个小问题。我注意到的第一件事是ServiceResolver被删除了。在删除之前,我使用它以以下方式注册自定义模型绑定器提供程序:

IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider));
List<Object> services = new List<object>(modelBinderProviderServices) { new CustomDynamicObjectModelBinderProvider() };
GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());
我尝试用以下代码替换旧代码,但没有结果:

GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider());
当我尝试将数据放入给定的操作时,没有调用模型提供程序的GetBinder方法,并且模型参数设置为null。通过将Acion/方法的签名更改为以下内容,我可以使用modelbinder属性使操作使用想要的modelbinder

[HttpPut]
public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model)
虽然这样做有效,但我真的不想在所有控制器/操作中都使用这种语法

我想我应该提到,我的模型绑定器提供程序继承自:

System.Web.Http.ModelBinding.ModelBinderProvider
我这样说是因为我看到在以下命名空间中有另一个ModelBinderProvider类:

Microsoft.Web.Mvc.ModelBinding

重述一下:如何在MVC4 RC WebApi中注册自定义modelbinder?

自测试版以来,Web API中的模型绑定规则发生了变化。新规则如中所述。现在,复杂类型的模型绑定仅在向参数显式添加
ModelBinder
属性时有效

自从发布候选版本以来,参数绑定机制再次发生了更改,因此您可能希望在进行太多更改之前等待RTM。在RC版本中,还有几个其他选项可以使用,具体取决于您试图绑定的数据的来源(查询字符串或请求正文)

  • 如果数据源是请求正文,则可以创建自定义的
    MediaTypeFormatter
    ,而不是模型绑定器:

  • 如果您的数据来自查询字符串,并且希望避免在参数上显式包含
    [ModelBinder]
    属性,那么您可以使用和的组合


在RTM版本(或当前的夜间版)中,如果其他选项不起作用,您可以使用自定义选项。

感谢您的澄清。你链接的帖子也帮我把事情弄清楚了。
Microsoft.Web.Mvc.ModelBinding