ASP.NET MVC 過濾器(四)

 ASP.NET MVC 過濾器(四)

前言

前一篇對IActionFilter方法執行過濾器在框架中的執行過程作了大概的描述,本篇將會對IActionFilter類型的過濾器使用來作一些介紹。c#

 

ASP.NET MVC過濾器

  • 過濾器在系統框架中的總體對象模型框架

  • IAuthorizationFilter受權認證過濾器的執行過程ide

  • 使用IAuthorizationFilter過濾器學習

  • IActionFilter行爲過濾器的執行過程this

  • 自定義實現IActionFilter行爲過濾器編碼

  • 異常過濾器的使用spa

自定義實現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類型過濾器就講解到這裏。

相關文章
相關標籤/搜索