3

我最近从 MVC4 beta 更新到 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());

利用此模型绑定器提供程序的操作具有以下签名:

[HttpPut]
public void Put(CustomDynamicObject model)

我尝试用以下代码替换旧代码,但没有结果:

GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider());

当我尝试将数据放入给定的操作时,模型提供者的 GetBinder 方法没有被调用,并且模型参数设置为 null。通过将 Acion/方法的签名更改为以下内容,我能够使用 ModelBinder 属性使操作使用所需的模型绑定器

[HttpPut]
public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model)

虽然这可行,但我真的不想在我的所有控制器/操作中使用这种语法。

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

System.Web.Http.ModelBinding.ModelBinderProvider

我这样说是因为我看到以下命名空间中有另一个 ModelBinderProvider 类:

Microsoft.Web.Mvc.ModelBinding

回顾一下:如何在 MVC4 RC WebApi 中注册自定义模型绑定器?

4

1 回答 1

7

自 Beta 版以来,Web API 中的模型绑定规则发生了变化。Mike Stall 的帖子中描述了新规则。复杂类型的模型绑定现在仅在显式ModelBinder向参数添加属性时才有效。

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

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

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

HttpParameterBinding在 RTM 版本(或当前的 nightlies)中,如果其他选项不起作用,您将能够使用自定义。

于 2012-06-08T03:27:51.093 回答