背景
Mvc 提供了一种可扩展的模型绑定机制,具体来说就是:将客户端传递的参数按照一定的策略绑定到 action 的参数上,这带来的直接好处就是让 action 的参数支持强类型。一般来说我们有如下方式使用模型的绑定特性:
- 按照约定。
- 自定义一个 IModelBinder,然后将其应用到需要的参数上。
- 自定义一个 IModelBinder,然后将其应用到指定的 Controller 上(不支持继承)。
- 自定义一个 IModelBinder,然后将其注册到 ModelBinders.Binders 中(影响全局)。
- 自定义一个 IModelBinder,然后将其注册到 ModelBinders.Binders.DefaultBinder 中(影响全局)。
有一点让我意外的是,在 Controller 的实例方法中可以访问:this.Binders,这让我以为可以提供 Controller 继承体系级别的模型绑定机制,最后发现 this.Binders 也是全局配置。下文说一下如何提供 Controller 继承体系使用的 ModelBinder。
直接看代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web.Mvc; 7 8 namespace Happy.Web.Mvc 9 { 10 /// <summary> 11 /// 提供控制器级别的默认 ModelBinder。 12 /// </summary> 13 public sealed class HappyModelBinder : IModelBinder 14 { 15 private static readonly DefaultModelBinder _defaultModelBinder = new DefaultModelBinder(); 16 17 /// <inheritdoc /> 18 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 19 { 20 var supportDefaultModelBinder = controllerContext.Controller as ISupportDefaultModelBinder; 21 if (supportDefaultModelBinder != null && supportDefaultModelBinder.DefaultModelBinder != null) 22 { 23 return supportDefaultModelBinder.DefaultModelBinder.BindModel(controllerContext, bindingContext); 24 } 25 26 return _defaultModelBinder.BindModel(controllerContext, bindingContext); 27 } 28 } 29 }
将上面的 ModelBinder 设置为 DefaultBinder 就行了。