MVC Action Filter


ASP.NET MVC Framework支持四種不同類型的Filter:

  1. Authorization filters – 實現IAuthorizationFilter接口的屬性.
  2. Action filters – 實現IActionFilter接口的屬性.
  3. Result filters – 實現IResultFilter接口的屬性.
  4. 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屬性值,將會拋出一個異常。

來看一個示例:

[Filter1(Order = 2)]
[Filter2(Order 
= 3)]
[Filter3(Order 
= 1)]
public void Index()
{
    RenderView(
"Index");
}

Filter的執行順序為:Filter3 => Filter1 => Filter2.

 

內置過濾器簡介

1OutputCacheAttribute

 

[OutputCache(Duration=10,VaryByParam="none")]
        public ActionResult TestCache() {
            ViewBag.Time = DateTime.Now.ToString();
            return View();
        }

 

上述代碼在動作方法上設置了OutputCache特性,使得頁面具有緩存功能,緩存10秒。Cache的屬性也可在web.config中設置

<caching>
          <outputCacheSettings>
              <outputCacheProfiles>
                  <add name="outPutCache" duration="10" varyByParam="none"/>
              </outputCacheProfiles>
          </outputCacheSettings>
      </caching>

相應的動作方法上

[OutputCache(CacheProfile="outPutCache")]
        public ActionResult TestCache() {
            ViewBag.Time = DateTime.Now.ToString();
            return View();
        }

2 AuthorizeAttribute

該類主要實現頁面的成員和角色管理,AuthorizeAttribute類中設置了兩個屬性,分別是Users和Roles,分別表示成員和角色

[Authorize]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

上述動作方法上設置了Authorize特性,指明該動作方法只能是注冊並通過認證的用戶才能訪問

[Authorize(Users="test1,test2")]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

上述動作方法指明只有用戶test1,test2能夠訪問,如果用戶過多,可以將這些用戶設置為一類角色,通過設置角色參數來設定

  [Authorize(Roles="Admin")]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

上述動作方法指明只有角色為Admin的用戶才能訪問。

3 HandleErrorAttribute

該類實現網站中指定控制器或者控制器中相關方法的異常處理。在動作方法上設置了[HandleError]特性后,發生異常時將自動交給異常處理頁面,在MVC 4中,創建項目時,已經在Global.asax中添加了全局的HandleError特性

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

 

ActionFilterAttribute基類

為了讓用戶更簡單的創建一個自定義action filter,ASP.NET MVC Framework提供了一個基類ActionFilterAttribute,這個類實現了IActionFilter和IResultFilter接口,並且繼承了Filter類。

這里的術語並不完全一致,從技術上說,這個類繼承ActionFitlerAttribute,並且同時實現了action filter和result filter接口,但是從寬松意義上說,在ASP.NET MVC Framework中,任何實現filter的類型都是action filter。

ActionFilterAttribute類有以下的方法可以重寫:

  • OnActionExecuting – 在controller action執行之前調用
  • OnActionExecuted – 在controller action執行之后調用
  • OnResultExecuting – 在controller action result執行之前調用
  • OnResultExecuted – 在controller action result執行之后調用

以下是這幾個方法的執行順序:

OnActionExecuting()-> Action execute & return View() ->OnActionExecuted() ->OnResultExecuting() -> Render View() ->OnResultExecuted()

為了闡述如何創建一個自定義的action filter,我們會創建一個自定義的action filter,用於記錄controller action處理的不同階段的日志信息,並顯示到Visual Studio輸出窗口中。

 

 public class LoginActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Log("OnActionExecuted",filterContext.RouteData);
            base.OnActionExecuted(filterContext);
        }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Log("OnActionExecuting", filterContext.RouteData);
            base.OnActionExecuting(filterContext);
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Log("OnResultExecuted", filterContext.RouteData);
            base.OnResultExecuted(filterContext);
        }
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Log("OnResultExecuting", filterContext.RouteData);
            base.OnResultExecuting(filterContext);
        }
        private void Log(string methodName, RouteData routeData) {
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];
            var message = String.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);
            Debug.WriteLine(message,"Action Filter Log");
        }
    }

 

輸出結果:

Action Filter Log: OnActionExecuting controller: Home action: Index
Action Filter Log: OnActionExecuted controller: Home action: Index
Action Filter Log: OnResultExecuting controller: Home action: Index
Action Filter Log: OnResultExecuted controller: Home action: Index

 

 Filter應用實例:

ASP.NET MVC 入門10、Action Filter 與 內置的Filter實現(實例-防盜鏈)

ASP.NET MVC Action Filter - 緩存與壓縮

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM