重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍。
创新互联是专业的槐荫网站建设公司,槐荫接单;提供成都做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行槐荫网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
过滤器在系统框架中的整体对象模型
IAuthorizationFilter授权认证过滤器的执行过程
使用IAuthorizationFilter过滤器
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类型过滤器就讲解到这里。