標籤:asp.net mvc filter asp.net mvc .net c#
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類型過濾器就講解到這裡。
金源
出處:http://blog.csdn.net/jinyuan0829
本文著作權歸作者和CSDN共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面