了解動作篩選 (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() 方法。 如有需要,您可以將多個動作篩選套用至相同的動作。 例如,您可能想要將 和 HandleError 動作篩選套用 OutputCache 至相同的動作。

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

不同類型的篩選

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

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

篩選會依照上述循序執行。 例如,授權篩選一律會在動作篩選準則之前執行,而例外狀況篩選一律會在其他類型的篩選之後執行。

授權篩選可用來實作控制器動作的驗證和授權。 例如,授權篩選準則是授權篩選準則的範例。

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

結果篩選準則包含執行檢視結果前後執行的邏輯。 例如,您可能想要在檢視轉譯至瀏覽器之前修改檢視結果。

例外狀況篩選準則是要執行的最後一種篩選。 您可以使用例外狀況篩選來處理控制器動作或控制器動作結果所引發的錯誤。 您也可以使用例外狀況篩選來記錄錯誤。

每個不同類型的篩選都會以特定循序執行。 如果您想要控制執行相同類型篩選的順序,您可以設定篩選的 Order 屬性。

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

Base ActionFilterAttribute 類別

為了讓您更輕鬆地實作自訂動作篩選器,ASP.NET MVC 架構包含基 ActionFilterAttribute 類。 這個類別會同時 IActionFilter 實作 和 IResultFilter 介面,並繼承自 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 控制器所公開的任何動作時, 方法 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 [輸出] 視窗。