如何注册在MVC4 RC的WebAPI的自定义模型绑定器(How to register a cus

2019-09-17 19:57发布

最近,我从公测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());

它利用这种模式,粘合剂供应商的优势作用有以下特征:

[HttpPut]
public void Put(CustomDynamicObject model)

我试着用下面的,但以取代旧的代码没有结果:

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的自定义模型绑定器?

Answer 1:

该模型结合在网页API规则公测以来已经改变。 新规则中描述麦克失速的帖子 。 模型的复杂类型的结合,如果你明确地添加一个现在只能ModelBinder属性参数。

由于候选发布版的参数绑定机制变了,所以你可能要做出太多改变之前等待RTM。 有一对夫妇的可能在RC版本中运行其他选项 - 视源是您要绑定(查询字符串或请求体)中的数据是什么。

  • 如果您的数据源是请求主体,那么你可以创建自定义MediaTypeFormatter ,而不是一个模型绑定:

  • 如果您的数据来自查询字符串,并要避免明确包括[ModelBinder]在您的参数属性,那么您可以使用组合自定义TypeConverter和一个自定义的IValueProvider

在RTM版本(或电流Nightlies版),你就可以使用自定义HttpParameterBinding如果其他选项不起作用。



文章来源: How to register a custom modelbinder in MVC4 RC WebApi