c# - 如何在 MVC4 RC WebApi 中注册自定义模型绑定(bind)器

标签 c# asp.net-mvc-4 asp.net-web-api

我最近从 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] 属性,那么您可以使用 custom TypeConverter 的组合和一个 custom IValueProvider .

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

关于c# - 如何在 MVC4 RC WebApi 中注册自定义模型绑定(bind)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10921726/

相关文章:

c# - ListView.RetrieveVirtualItem 事件到底是什么 - C#

c# - 在 C# 中为方法指定访问修饰符等同于 get 和 set

jquery - 将值注入(inject) CSS 类

Angular 2 SyntaxError : Unexpected token < in JSON at position 0 at JSON. 解析(<匿名>)

c# - 如何使用 Java 使用 SOAP Web 服务?

c# - 如何获取 IE 凭据以在我的代码中使用?

c# - 通过 Windows Azure 发布后无法加载文件或程序集 System.Runtime.Serialization

css - 问题 :Menu Hide behind PDF in IE

asp.net - 微软.AspNet.WebApi.Cors : The requested resource does not support http method 'OPTIONS'

c# - Autofac:如何加载引用但未直接使用的程序集