原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.htmlhtml
有時候你想在調用action方法以前或者action方法以後處理一些邏輯。爲了支持這個。ASP.NET MVC贊成你建立action過濾器。Action過濾器是本身定義的Attributes。用來標記加入Action方法以前或者Action方法以後的行爲到控制器類中的Action方法中。緩存
一些可能用到Action過濾器的地方有:網絡
ASP.NET MVC爲咱們提供瞭如下的幾個Filter接口:post
IActionFilter
IAuthorizationFilter
IExceptionFilter
IResultFilter
要實現一個Filter,咱們需要繼承自FilterAttribute類同一時候實現上面的一個或幾個接口:spa
這幾個接口提供的方法例如如下:日誌
上圖的方法和Filter接口相應的方法按名稱對號入座就可以。code
接口有兩個方法:htmIActionFilter
當中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接口也提供了兩個方法:
他們分別在Action返回結果(好比return View();)以前和以後運行。
和
幾乎相同就很少說了。IActionFilter
IAuthorizationFilter
是一個用於身份驗證的Filter。僅僅提供了一個void OnAuthorization(AuthorizationContext filterContext)方法。
IExceptionFilter
會在出現異常的時候調用,也是僅僅 提供一個void OnException(ExceptionContext filterContext)的方法;
這些Filter可以被應用在類或者方法上。如下咱們來看一下他們的運行順序。
首先咱們寫一個BaseController並加上兩個Filter:
應爲Controller類是實現這幾個Filter接口的,因此咱們在HomeController中重寫Controller基類中的所有Filter接口的方法,並在HomeController類和裏面的Filter方法加上咱們本身定義的MyFilter:
而後咱們執行一下看看結果怎樣:
從執行結果咱們可以看到。在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屬性值。將會拋出一個異常。
來看一個演示樣例:
Filter的運行順序爲:Filter3 => Filter1 => Filter2.