我最近从 MVC4 beta 更新到 RC,并且遇到了一个 WebApi 项目的小问题。我注意到的第一件事是删除了 ServiceResolver。在它被删除之前,我使用它通过以下方式注册自定义模型 Binder 提供程序:
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());
利用此模型 Binder 提供程序的操作具有以下签名:
[HttpPut]
public void Put(CustomDynamicObject model)
我尝试用以下代码替换旧代码但没有结果:
GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider());
当我尝试将数据放入给定操作时,未调用模型提供程序的 GetBinder 方法并且模型参数设置为 null。通过将 Acion/方法的签名更改为以下内容,我能够使用 ModelBinder 属性使操作使用所需的模型绑定(bind)器
[HttpPut]
public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model)
虽然这行得通,但我真的不想在我的所有 Controller /操作中都使用这种语法。
我想我应该提到我的模型 Binder 提供者继承自:
System.Web.Http.ModelBinding.ModelBinderProvider
我这么说是因为我看到在下面的命名空间中还有另一个 ModelBinderProvider 类:
Microsoft.Web.Mvc.ModelBinding
回顾一下:如何在 MVC4 RC WebApi 中注册自定义模型绑定(bind)器?
最佳答案
自 Beta 以来,Web API 中的模型绑定(bind)规则发生了变化。 Mike Stall's post 中描述了新规则.复杂类型的模型绑定(bind)现在仅在您向参数显式添加 ModelBinder
属性时才有效。
自 Release Candidate 以来,参数绑定(bind)机制再次发生了变化,因此您可能希望等待 RTM,然后再进行太多更改。在 RC 版本中还有一些其他选项可能有效 - 取决于您尝试绑定(bind)的数据的来源(查询字符串或请求正文)。
如果您的数据源是请求主体,那么您可以创建自定义
MediaTypeFormatter
而不是模型绑定(bind)器:如果您的数据来自查询字符串,并且您希望避免在参数中显式包含
[ModelBinder]
属性,那么您可以使用 customTypeConverter
的组合和一个 customIValueProvider
.
在 RTM 版本(或当前的夜间版)中,您将能够使用自定义 HttpParameterBinding
如果其他选项不起作用。
关于c# - 如何在 MVC4 RC WebApi 中注册自定义模型绑定(bind)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10921726/