ASP.NET MVC 过滤器(四)

 ASP.NET MVC 过滤器(四)

前言

前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍。

 

ASP.NET MVC过滤器

  • 过滤器在系统框架中的整体对象模型

  • IAuthorizationFilter授权认证过滤器的执行过程

  • 使用IAuthorizationFilter过滤器

  • IActionFilter行为过滤器的执行过程

  • 自定义实现IActionFilter行为过滤器

  • 异常过滤器的使用

自定义实现IActionFilter行为过滤器

还是接着前面控制器篇幅的示例来演示,没看过的朋友也没关系,只要有个一个基础的显示页面就可以了。

图1

这是初始页面调用了IoCDemoController控制器默认的Index方法。

下面我们来实现我们自定义的IActionFilter类型。

代码1-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1      public  class  MyCustomActionFilterAttribute : FilterAttribute, IActionFilter
  2     {
 
  4          public  void  OnActionExecuted(ActionExecutedContext filterContext)
  5         {
  6             filterContext.HttpContext.Response.Write( "这是在控制器方法:"  + filterContext.ActionDescriptor.ActionName +  "-执行之后" );
  7             
  8         }
 
10          public  void  OnActionExecuting(ActionExecutingContext filterContext)
11         {
12             filterContext.HttpContext.Response.Write( "这是在控制器方法:"  + filterContext.ActionDescriptor.ActionName +  "-执行之前" );
13         }
14 }

在上篇中我们对上述代码的中设计到类型结构已经作了描述了,在此不再重复,我们定义好了行为过滤器那就把它用起来。

在应用了此过滤器过后我们再来看一下运行的结果:

图2

我们可以试着把过滤器放在所要执行的控制器行为上,而不是控制器:

代码1-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  1      public  class  IoCDemoController : Controller
  2     {
  3          private  IDataStandard _DataStandard;
 
  5          public  IoCDemoController(IDataStandard dataStandard)
  6         {
  7             _DataStandard = dataStandard;
  8         }
 
10         [MyCustomActionFilter]
11          public  ActionResult Index()
12         {
13              return  View(_DataStandard.GetProducts());
14             
15         }
16     }

再次运行发现结果会和放在控制器上的结果一样。唯一不同的是过滤器的应用范围不同,放在方法上的时候只有在请求这个控制器行为的时候才会调用这些过滤器,而放在控制器上的过滤器,无论你请求控制器中的哪个行为都会调用。

 

过滤器的执行顺序

通过前几篇的学习,我们从框架的硬编码中可以看出,控制器不同类型的执行顺序,依次是授权认证过滤器、行为过滤器、结果过滤器。而还有一种异常过滤器,是不受限制的,只要有异常就会触发调用。这里说的是不同类型的过滤器之前的框架调用顺序,那么同一种类型过滤器之间的调用顺序我们怎么控制呢?来看示例:

代码1-3

1
2
3
4
5
6
7
8
9
10
11
12
13
  1      public  class  MyCustomActionFileterOneAttribute : FilterAttribute, IActionFilter
  2     {
 
  4          public  void  OnActionExecuted(ActionExecutedContext filterContext)
  5         {
  6             filterContext.HttpContext.Response.Write( "这是"  this .GetType().Name +  "过滤器在控制器方法:"  + filterContext.ActionDescriptor.ActionName +  "-执行之后输出" );
  7         }
 
  9          public  void  OnActionExecuting(ActionExecutingContext filterContext)
10         { 
11             filterContext.HttpContext.Response.Write( "这是" + this .GetType().Name+ "过滤器在控制器方法:"  + filterContext.ActionDescriptor.ActionName +  "-执行之前输出" );
12         }
13     }

并且上述1-1代码中的输出示例修改为1-3这样的输入示例,然后我们再把新定义的行为过滤器加到行为方法上:

1
2
3
4
5
6
1         [MyCustomActionFilter]
2         [MyCustomActionFileterOne]
3          public  ActionResult Index()
4         {
5              return  View(_DataStandard.GetProducts());
6         }

我们看一下结果如图:

图3

看到这个结果,有的朋友可能会说了,是按照添加后位置的顺序来执行的,可以这么说吧,我们再来修改一下添加在Index()方法之上的两个过滤器中的属性变量Order,这个属性来至IMvcFilter接口类型,所有的过滤器类型都是要实现它的,只不过在我们自定义中的FilterAttribute类型已经帮我们实现了。

看下修改后的示例代码:

代码1-4

1
2
3
4
5
6
1         [MyCustomActionFilter(Order=2)]
2         [MyCustomActionFileterOne(Order=1)]
3          public  ActionResult Index()
4         {
5              return  View(_DataStandard.GetProducts());
6         }

运行结果如图:

对于过滤器的使用还有许多种方式,本篇的IActionFilter类型过滤器就讲解到这里。

 




     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1427499,如需转载请自行联系原作者



  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值