共用方式為


了解動作篩選 (C#)

演講者:Microsoft

下載 PDF

本教學課程的目標是解釋動作篩選器。 動作篩選器是一個可以套用於控制器動作 (或整個控制器) 的屬性,它可以修改動作的執行方式。

了解動作篩選器

本教學課程的目標是解釋動作篩選器。 動作篩選器是一個可以套用於控制器動作 (或整個控制器) 的屬性,它可以修改動作的執行方式。 ASP.NET MVC 框架包含幾個動作篩選器:

  • OutputCache – 此動作篩選器將控制器動作的輸出快取指定的時間。
  • HandleError – 此動作篩選器處理控制器動作執行時引發的錯誤。
  • 授權 – 此動作篩選器可讓您限制對特定使用者或角色的存取。

您也可以建立自己的自訂動作篩選器。 例如,您可能想要建立自訂動作篩選器以實作自訂身份驗證系統。 或者,您可能想要建立一個動作篩選器來修改控制器動作傳回的檢視資料。

在本教學課程中,您將學習如何從頭開始建立動作篩選器。 我們建立一個日誌動作篩選器,將動作處理的不同階段記錄到 Visual Studio 輸出視窗。

使用動作濾鏡

動作篩選器是一個屬性。 您可以將大多數動作篩選器套用於單一控制器動作或整個控制器。

例如,清單 1 中的資料控制器公開了一個名為 Index() 返回目前時間的動作。 這個動作是用 OutputCache 動作濾鏡修飾的。 此篩選器會導致動作傳回的值快取 10 秒。

清單 1 – Controllers\DataController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
     public class DataController : Controller
     {
          [OutputCache(Duration=10)]
          public string Index()
          {
               return DateTime.Now.ToString("T");
          }
     }
}

如果您透過在瀏覽器網址列中輸入 URL /Data/Index 並多次點擊重新整理按鈕來重複呼叫 Index() 動作,那麼您將看到相同的時間 10 秒。 Index() 動作的輸出快取 10 秒 (請參閱圖 1)。

快取時間

圖 01:快取時間 (點擊看大圖)

在清單 1 中,單一 OutputCache 動作篩選器 (動作篩選器) 會套用於 Index() 方法。 如果需要,您可以將多個動作篩選器套用到相同動作。 例如,您可能想要將 OutputCacheHandleError 動作篩選器套用至相同動作。

在清單 1 中,OutputCache 動作篩選器會套用於 Index() 動作。 您也可以將此屬性套用到 DataController 類別本身。 在這種情況下,控制器公開的任何動作傳回的結果將會快取 10 秒。

不同類型的篩選器

ASP.NET MVC 框架支援四種不同類型的篩選器:

  1. 授權篩選器 – 實作 IAuthorizationFilter 屬性。
  2. 動作篩選器 – 實作 IActionFilter 屬性。
  3. 結果篩選器 – 實作 IResultFilter 屬性。
  4. 例外狀況篩選器 – 實作 IExceptionFilter 屬性。

篩選器按照上面列出的順序執行。 例如,授權篩選器始終在動作篩選器之前執行,例外狀況篩選器始終在所有其他類型的篩選器之後執行。

授權篩選器用於實現控制器動作的身份驗證和授權。 例如,授權篩選器是授權篩選器的一個範例。

動作篩選器包含在控制器動作執行之前和之後執行的邏輯。 例如,您可以使用動作篩選器來修改控制器動作傳回的檢視資料。

結果篩選器包含在執行檢視結果之前和之後執行的邏輯。 例如,您可能想要在檢視呈現到瀏覽器之前修改檢視結果。

例外狀況篩選器是最後運作的篩選器類型。 您可以使用例外狀況篩選器來處理由控制器動作或控制器動作結果引發的錯誤。 您也可以使用例外狀況篩選器來記錄錯誤。

每種不同類型的篩選器都按特定順序執行。 如果要控制相同類型篩選器的執行順序,則可以設定篩選器的 Order 屬性。

所有動作篩選器的基底類別是 System.Web.Mvc.FilterAttribute 類別。 如果要實作特定類型的篩選器,則需要建立一個繼承 Filter 基底類別並實作一個或多個 IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter 介面的類別。

ActionFilterAttribute 基本類

為了讓您更容易實作自訂動作篩選器,ASP.NET MVC 框架包含一個基底 ActionFilterAttribute 類別。 該類別實作了 IActionFilterIResultFilter 介面並繼承自 Filter 類別。

這裡的術語並不完全一致。 從技術上講,繼承自 ActionFilterAttribute 類別的類別既是動作篩選器也是結果篩選器。 但是,從廣義上講,「動作篩選器」一詞用於指稱 ASP.NET MVC 框架中的任何類型的篩選器。

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

  • OnActionExecuting – 在執行控制器動作之前呼叫此方法。
  • OnActionExecuted – 執行控制器動作後呼叫此方法。
  • OnResultExecuting – 在執行控制器動作結果之前呼叫此方法。
  • OnResultExecuted – 執行控制器動作結果後呼叫此方法。

在下一節中,我們將了解如何實作這些不同的方法。

建立日誌動作篩選器

為了說明如何建立自訂操作篩選器,我們將建立一個自訂操作篩選器,它將處理控制器操作的階段記錄到 Visual Studio 輸出視窗。 我們的 LogActionFilter 包含在清單 2 中。

清單 2 – ActionFilters\LogActionFilter.cs

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.ActionFilters
{
     public class LogActionFilter : ActionFilterAttribute

     {
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
               Log("OnActionExecuting", filterContext.RouteData);       
          }

          public override void OnActionExecuted(ActionExecutedContext filterContext)
          {
               Log("OnActionExecuted", filterContext.RouteData);       
          }

          public override void OnResultExecuting(ResultExecutingContext filterContext)
          {
               Log("OnResultExecuting", filterContext.RouteData);       
          }

          public override void OnResultExecuted(ResultExecutedContext filterContext)
          {
               Log("OnResultExecuted", filterContext.RouteData);       
          }


          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");
          }

     }
}

在清單 2 中,OnActionExecuting()OnActionExecuted()OnResultExecuting()OnResultExecuted()Log() 方法都會呼叫該方法。 方法的名稱和目前路線資料被傳遞給 Log() 方法。 Log() 方法將一則訊息寫入 Visual Studio 輸出視窗 (請參閱圖 2)。

寫入 Visual Studio 輸出視窗

圖 02:寫入 Visual Studio 輸出視窗 (按一下查看全尺寸影像)

清單 3 中的 Home 控制器說明如何將 Log 動作篩選器套用到整個控制器類別。 每當呼叫 Home 控制器公開的任何動作 (無論是 Index() 方法還是 About() 方法) 時,處理動作的階段都會記錄到 Visual Studio 輸出視窗中。

清單 3 – Controllers\HomeController.cs

using System.Web.Mvc;
using MvcApplication1.ActionFilters;

namespace MvcApplication1.Controllers
{
     [LogActionFilter]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }

          public ActionResult About()
          {
               return View();
          }
     }
}

摘要

在本教學課程中,我們向您介紹了 ASP.NET MVC 動作篩選器。 您了解了四種不同類型的篩選器:授權篩選器、動作篩選器、結果篩選器和例外狀況篩選器。 您也了解了基本 ActionFilterAttribute 類別。

最後,您學習如何實作簡單的動作篩選器。 我們建立了一個日誌動作篩選器,它將處理控制器動作的階段記錄到 Visual Studio 輸出視窗。