ASP.NET MVC - 過濾器



在 ASP.NET MVC 中,控制器定義操作方法,這些方法通常與可能的使用者互動具有一對一的關係,但有時您希望在呼叫操作方法之前或操作方法執行之後執行邏輯。

為了支援這一點,ASP.NET MVC 提供了過濾器。過濾器是自定義類,它們提供宣告式和程式設計式方法來向控制器操作方法新增操作前和操作後行為。

操作過濾器

操作過濾器是一個屬性,您可以將其應用於控制器操作或整個控制器,以修改操作的執行方式。ASP.NET MVC 框架包含多個操作過濾器 -

  • OutputCache - 將控制器操作的輸出快取指定時間。

  • HandleError - 處理執行控制器操作時引發的錯誤。

  • Authorize - 使您能夠限制對特定使用者或角色的訪問。

過濾器型別

ASP.NET MVC 框架支援四種不同型別的過濾器 -

  • 授權過濾器 - 實現 IAuthorizationFilter 屬性。

  • 操作過濾器 - 實現 IActionFilter 屬性。

  • 結果過濾器 - 實現 IResultFilter 屬性。

  • 異常過濾器 - 實現 IExceptionFilter 屬性。

過濾器按上面列出的順序執行。例如,授權過濾器始終在操作過濾器之前執行,異常過濾器始終在其他每種型別的過濾器之後執行。

授權過濾器用於為控制器操作實現身份驗證和授權。例如,Authorize 過濾器是授權過濾器的示例。

讓我們透過建立一個新的 ASP.Net MVC 專案來檢視一個簡單的示例。

步驟 1 - 開啟 Visual Studio 並點選檔案 → 新建 → 專案選單選項。

將開啟一個新的專案對話方塊。

New Project Menu Option

步驟 2 - 從左側窗格中,選擇模板 → Visual C# → Web。

步驟 3 - 在中間窗格中,選擇 ASP.NET Web 應用程式。

步驟 4 - 在名稱欄位中輸入專案名稱 MVCFiltersDemo,然後點選確定繼續,您將看到以下對話方塊,提示您設定 ASP.NET 專案的初始內容。

MVCFiltersDemo

步驟 5 - 為簡單起見,選擇“空”選項,並在“新增資料夾和核心引用”部分選中 MVC 複選框,然後點選“確定”。

它將建立一個具有最少預定義內容的基本 MVC 專案。

步驟 6 - 要新增控制器,請右鍵單擊解決方案資源管理器中的控制器資料夾,然後選擇新增 → 控制器。

它將顯示新增腳手架對話方塊。

Controller Add Scaffold Dialog

步驟 7 - 選擇 MVC 5 控制器 - 空選項,然後點選“新增”按鈕。

將出現新增控制器對話方塊。

Add Controller Dialog

步驟 8 - 將名稱設定為 HomeController 並點選“新增”按鈕。

您將在 Controllers 資料夾中看到一個新的 C# 檔案“HomeController.cs”,它也在 Visual Studio 中開啟以供編輯。

應用操作過濾器

操作過濾器可以應用於單個控制器操作或整個控制器。例如,操作過濾器OutputCache應用於名為 Index() 的操作,該操作返回字串。此過濾器導致操作返回的值快取 15 秒。

為了使此示例正常工作,讓我們透過使用以下程式碼更改名為Index的操作方法來修改控制器類。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      [OutputCache(Duration = 15)]
		
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
   }
}

執行此應用程式後,您將看到瀏覽器正在顯示 Index 操作方法的結果。

MVC Filters Tutorial

讓我們新增另一個操作方法,它將顯示當前時間。

namespace MVCFiltersDemo.Controllers{
   public class HomeController : Controller{
      // GET: Home
		
      [OutputCache(Duration = 15)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [OutputCache(Duration = 20)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

請求以下 URL,https://:62833/Home/GetCurrentTime,您將收到以下輸出。

Localhost GetCurrentTime

如果重新整理瀏覽器,您將看到相同的時間,因為操作快取了 20 秒。20 秒後重新整理時,它將更新。

自定義過濾器

要建立您自己的自定義過濾器,ASP.NET MVC 框架提供了一個基類,稱為 ActionFilterAttribute。此類實現 IActionFilter 和 IResultFilter 介面,並且兩者都派生自 Filter 類。

讓我們透過在您的專案中建立一個名為 ActionFilters 的新資料夾來檢視自定義過濾器的簡單示例。新增一個類,為此右鍵單擊 ActionFilters 資料夾,然後選擇新增 → 類。

Custom Filter

在名稱欄位中輸入“MyLogActionFilter”,然後點選“新增”按鈕。

此類將派生自ActionFilterAttribute,它是一個基類,並覆蓋以下方法。以下是 MyLogActionFilter 的完整實現。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

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

namespace MVCFiltersDemo.ActionFilters {
   public class MyLogActionFilter : 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");
      }
   }
}

現在讓我們使用以下程式碼將日誌過濾器應用於 HomeController。

using MVCFiltersDemo.ActionFilters;
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   [MyLogActionFilter]
   public class HomeController : Controller{
      // GET: Home
		
      [OutputCache(Duration = 10)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [OutputCache(Duration = 10)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

執行應用程式,然後觀察輸出視窗。

Output Window

如以上螢幕截圖所示,操作處理的階段記錄到 Visual Studio 輸出視窗。

廣告

© . All rights reserved.