前一篇對IActionFilter方法執行過濾器在架構中的執行過程做了大概的描述,本篇将會對IActionFilter類型的過濾器使用來做一些介紹。
ASP.NET MVC 過濾器(四)
前言
ASP.NET MVC過濾器
- 過濾器在系統架構中的整體對象模型
- IAuthorizationFilter授權認證過濾器的執行過程
- 使用IAuthorizationFilter過濾器
- IActionFilter行為過濾器的執行過程
- 自定義實作IActionFilter行為過濾器
- 異常過濾器的使用
還是接着前面控制器篇幅的示例來示範,沒看過的朋友也沒關系,隻要有個一個基礎的顯示頁面就可以了。
圖1
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEDOxcTOyYzMycDMzIzNx8CX2ADNxAjMvwFO4kzNyYzLcl2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
這是初始頁面調用了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類型過濾器就講解到這裡。
作者:金源
出處:http://www.cnblogs.com/jin-yuan/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面