ASP.NET MVC 过滤器(四)

前言

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

ASP.NET MVC过滤器

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

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

  • 使用IAuthorizationFilter过滤器

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

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

  • 异常过滤器的使用

自定义实现IActionFilter行为过滤器

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

图1

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

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

代码1-1

     public class MyCustomActionFilterAttribute : FilterAttribute, IActionFilter
     {
 
         public void OnActionExecuted(ActionExecutedContext filterContext)
         {
             filterContext.HttpContext.Response.Write("这是在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之后");
             
         }
 
         public void OnActionExecuting(ActionExecutingContext filterContext)
         {
             filterContext.HttpContext.Response.Write("这是在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之前");
         }
 }

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

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

图2

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

代码1-2

     public class IoCDemoController : Controller
     {
         private IDataStandard _DataStandard;
 
         public IoCDemoController(IDataStandard dataStandard)
         {
             _DataStandard = dataStandard;
         }
 
         [MyCustomActionFilter]
         public ActionResult Index()
         {
             return View(_DataStandard.GetProducts());
             
         }
     }

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

过滤器的执行顺序

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

代码1-3

     public class MyCustomActionFileterOneAttribute : FilterAttribute, IActionFilter
     {
 
         public void OnActionExecuted(ActionExecutedContext filterContext)
         {
             filterContext.HttpContext.Response.Write("这是" + this.GetType().Name + "过滤器在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之后输出");
         }
 
         public void OnActionExecuting(ActionExecutingContext filterContext)
         { 
             filterContext.HttpContext.Response.Write("这是"+this.GetType().Name+"过滤器在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之前输出");
         }
     }

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

         [MyCustomActionFilter]
         [MyCustomActionFileterOne]
         public ActionResult Index()
         {
             return View(_DataStandard.GetProducts());
         }

我们看一下结果如图:

图3

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

看下修改后的示例代码:

代码1-4

         [MyCustomActionFilter(Order=)]
         [MyCustomActionFileterOne(Order=)]
         public ActionResult Index()
         {
             return View(_DataStandard.GetProducts());
         }

运行结果如图:

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

ASP.NET MVC 学习