ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?

背景

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 就行了。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值