• ASP.NET MVC 过滤器(四)


     ASP.NET MVC 过滤器(四)

    前言

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

     

    ASP.NET MVC过滤器

    • 过滤器在系统框架中的总体对象模型
    • IAuthorizationFilter授权认证过滤器的运行过程
    • 使用IAuthorizationFilter过滤器
    • IActionFilter行为过滤器的运行过程
    • 自己定义实现IActionFilter行为过滤器
    • 异常过滤器的使用

     

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

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

    图1

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

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

    代码1-1

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

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

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

    图2

    我们能够试着把过滤器放在所要运行的控制器行为上,而不是控制器:

    代码1-2

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

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

     

    过滤器的运行顺序

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

    代码1-3

     1     public class MyCustomActionFileterOneAttribute : FilterAttribute, IActionFilter
     2     {
     3 
     4         public void OnActionExecuted(ActionExecutedContext filterContext)
     5         {
     6             filterContext.HttpContext.Response.Write("这是" + this.GetType().Name + "过滤器在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-运行之后输出");
     7         }
     8 
     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         [MyCustomActionFilter]
    2         [MyCustomActionFileterOne]
    3         public ActionResult Index()
    4         {
    5             return View(_DataStandard.GetProducts());
    6         }

    我们看一下结果如图:

    图3

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

    看下改动后的演示样例代码:

    代码1-4

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

    执行结果如图:

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

     

     

    作者:金源

  • 相关阅读:
    Sublime text 3支持utf-8
    ubuntu17.10 安装firefox的flash
    opencv mat裁剪
    Ubuntu寻找某某库
    Ubuntu的 g++ gcc版本升降级
    Autotools知识点
    Counted(内存管理机制)
    operator new和operator delete
    STL学习笔记:空间配置器allocator
    function call操作符(operator()) 仿函数(functor)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6740051.html
Copyright © 2020-2023  润新知