ASP.NET MVC 入門九、Action Filter 與 內置的Filter實現(介紹)

原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.htmlhtml

有時候你想在調用action方法以前或者action方法以後處理一些邏輯。爲了支持這個。ASP.NET MVC贊成你建立action過濾器。Action過濾器是本身定義的Attributes。用來標記加入Action方法以前或者Action方法以後的行爲到控制器類中的Action方法中。緩存

一些可能用到Action過濾器的地方有:網絡

  • 日誌,異常處理
  • 身份驗證和受權 - 限制用戶的訪問
  • 輸出緩存 - 保存一個Action的結果
  • 網絡爬蟲的過濾
  • 本地化
  • 動態Action - 將一個Action注入到控制器中

ASP.NET MVC爲咱們提供瞭如下的幾個Filter接口:post

  • IActionFilter
  • IAuthorizationFilter
  • IExceptionFilter
  • IResultFilter

    要實現一個Filter,咱們需要繼承自FilterAttribute類同一時候實現上面的一個或幾個接口:spa

    public   class  MyFilter : FilterAttribute, IActionFilter, IResultFilter
    {

     

    這幾個接口提供的方法例如如下:日誌

    image

    上圖的方法和Filter接口相應的方法按名稱對號入座就可以。code

    IActionFilter接口有兩個方法:htm

    image

    當中OnActionExecuting在運行Action方法以前會被調用,OnActionExecuted會在Action方法運行後調用。注意他們的參數各自是ActionExecutingContext和ActionExecutedContext。blog

    ActionExecutedContext類包括一個 Canceled的屬性,贊成你取消當前的Action(怎麼原來在P3中是在ActionExecutingContext的Canceled屬性在P5中沒有了呢?奇妙.那麼在OnActionExecuting的時候怎麼取消一個Action呢?)。繼承

    FilterExcutedContext 類包括一個Exception屬性和一個ExceptionHandled屬性。假設Exception屬性爲null,則沒有異常在action stack中,代表Action方法執行並無錯誤發生。

    反之則爲出現異常。假設將ExceptionHandled屬性設置爲true則代表在這個Filter中已經處理了異常。

    IResultFilter接口也提供了兩個方法:

    image

    他們分別在Action返回結果(好比return View();)以前和以後運行。

    IActionFilter幾乎相同就很少說了。

    IAuthorizationFilter是一個用於身份驗證的Filter。僅僅提供了一個void OnAuthorization(AuthorizationContext filterContext)方法。

    IExceptionFilter會在出現異常的時候調用,也是僅僅 提供一個void OnException(ExceptionContext filterContext)的方法;

    這些Filter可以被應用在類或者方法上。如下咱們來看一下他們的運行順序。

    首先咱們寫一個BaseController並加上兩個Filter:

    [MyFilter2(Target  =   " BaseController " )]
    [MyFilter1(Target
    = " BaseController " )]
    public   class  BaseController : Controller

     

    應爲Controller類是實現這幾個Filter接口的,因此咱們在HomeController中重寫Controller基類中的所有Filter接口的方法,並在HomeController類和裏面的Filter方法加上咱們本身定義的MyFilter:

    HomeController

    而後咱們執行一下看看結果怎樣:

    image

    從執行結果咱們可以看到。在Controller中重寫的Filter會最早執行,而後到應用在類上的Filter。而後再到應用在類方法上的Filter。

    而4個接口的方法運行順序例如如下:IAuthorizationFilter -> IActionFilter -> IResultFilter -> IExceptionFilter .

    而對於同一個Filter。好比IAuthorizationFilter在MyFilter1和MyFilter2裏裏面的實現,又依據他們的載入順序不一樣而不一樣。

    在BaseController中應用的Filter會被子類繼承。假設子類又應用了和基類相同的Filter。則會不運行基類的Filter。好比上面的HomeController應用了MyFilter2,因此調用HomeController的MyFilter2。而不是BaseController的MyFilter2。

    這個運行順序還得你們好好研究才幹瞭解的。

    同一時候FilterAttribute還提供了一個Order的屬性,用於指定Filter的運行順序。

    每一個Action過濾器都有一個 Order 屬性。用來決定Action過濾器在該範圍內的運行順序。Order屬性必需是0(默認值)或者更大的整數值。省略Order屬性則會給該過濾器的Order值爲 -1, 代表未指明順序。

    不論什麼一個在同一範圍的Action過濾器Order設爲 -1 的都將按不肯定的順序運行,但在此以前過濾器有一個特定的順序(請參考上圖).

    當設置Order屬性的值的時候,必需指定一個惟一的值。假設兩個或者不少其它的Action過濾器具備一樣的Order屬性值。將會拋出一個異常。

    來看一個演示樣例:

    複製代碼
    [Filter1(Order  =   2 )]
    [Filter2(Order 
    =   3 )]
    [Filter3(Order 
    =   1 )]
    public   void  Index()
    {
        RenderView(
    " Index " );
    複製代碼

     

    Filter的運行順序爲:Filter3 => Filter1 => Filter2.

  • 相關文章
    相關標籤/搜索