ASP.NET MVC Framework支持四種不同類型的Filter:
- Authorization filters – 實現
IAuthorizationFilter接口的屬性
. - Action filters – 實現
IActionFilter接口的屬性
. - Result filters – 實現
IResultFilter接口的屬性
. - Exception filters – 實現
IExceptionFilter接口的
屬性.
Filter的默認的執行順序按上面的列表中順序進行。如驗證(authorization)Filter永遠都是最開始執行的,異常(exception)Filter永遠都是最后執行的,當然你也可以根據需要通過Order屬性設定過濾器執行的順序。
ASP.NET MVC Framework包括幾種Action Filter:
名稱 | 說明 |
OutputCacheAttribute | 類似於 Web Form中在 OutputCache 指令。 OutputCache 屬性允許在 MVC Framework 緩存控制器的輸出。 |
ValidateInputAttribute | 類似於 Web Form中 ValidateRequest 屬性。 MVC 框架默認將為 檢查HTML 或其他危險輸入傳入的 HTTP 請求。 如果檢測到,將引發異常。 使用此屬性可以禁用請求驗證。 |
AuthorizeAttribute | Authorize 屬性,可以對控制器操做的聲明性的授權檢查。 該屬性可以限制特定角色中的用戶的操作。 當您創建只應該給管理員角色中的用戶的操作時,您可以使用此屬性。默認使用的ASP.NET Membership服務,如果不使用ASP.NET 的Membership服務,可以繼承AuthorizeAttribute,重寫實現。 |
ValidateAntiForgeryTokenAttribute | 此屬性是一個解決方案以幫助防止跨站點的請求攻擊 (CSRF)。 它允許驗證的 HTTP POST 為特定於用戶的標記在 Framework。 有關詳細信息 CSRFs,請參閱" 使用 ASP.NET MVC AntiForgeryToken() 幫助器防止跨站點請求偽造 (CSFR)." |
驗證(authorization)filter用於實現在controller action上的驗證和授權,如Authorize filter就是一個驗證filter的例子;
Action filter包含一些邏輯,用於該action執行之前或者之后。比如可以使用一個action filter來修改action返回的view data;
Result filter包含一些邏輯,用於該action的view result執行之前和之后。比如可以修改一個view result在view被呈現到瀏覽器之前;
異常(Exception)Action用於處理異常信息,同樣可以使用異常filter記錄錯誤日志。
這些的filter類型是根據指定的順序執行的,如果需要控制他們的執行順序,需要設置filter的Order屬性。
這些類的基類為System.Web.Mvc.FilterAttribute類,如果需要實現一個特定的filter類型,可以創建一個繼承這個類的類,並且實現一個或多個IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。
Action過濾器的作用范圍
除了用Action過濾器標記一個Action方法外,你也可以用來標記一個完成的控制器類。如果這樣的話,這個Action過濾器將會應用到該控制器的所有Action方法上。
另外,如果你的控制器類繼承自別的控制器類,而基控制器類可能有它自己的Action過濾器Attributes。如果你在子類中重寫了基控制器類的Action方法,則子類的該Action方法也會有它自己的從基類繼承而來的Action過濾器Attributes。
Action過濾器的執行順序
每一個Action過濾器都有一個 Order 屬性,用來決定Action過濾器在該范圍內的執行順序。Order屬性必需是0(默認值)或者更大的整數值。省略Order屬性則會給該過濾器的Order值為 -1, 表明為指明順序。任何一個在同一范圍的Action過濾器Order設為 -1 的都將按不確定的順序執行,單在此之前過濾器有一個特定的順序(注:下面會說到).
當設置Order屬性的值的時候,必需指定一個唯一的值。如果兩個或者更多的Action過濾器具有相同的Order屬性值,將會拋出一個異常。
來看一個示例:
namespace WebApplication.Controllers { [LoginCheckAttribute(Order=1)] [UserAuthorizeAttribute(Order=2)] public class BaseController : Controller { } }
[Filter1(Order = 2)] [Filter2(Order = 3)] [Filter3(Order = 1)] public void Index() { RenderView("Index"); }
Filter的執行順序為:Filter3 => Filter1 => Filter2.
內置過濾器簡介
1 OutputCacheAttribute
[OutputCache(Duration=10,VaryByParam="none")] public ActionResult TestCache() { ViewBag.Time = DateTime.Now.ToString(); return View(); }