概念介紹
動作過濾器應該是我們平常工作中需要用到最多的過濾器了,動作過濾器,主要在我們的動作方法執行前后執行。
如果我們需要創建動作過濾器需要實現IActionFilter接口。
namespace System.Web.Mvc
{
//
// 摘要:
// 定義操作篩選器中使用的方法。
public interface IActionFilter
{
//
// 摘要:
// 在執行操作方法后調用。
//
// 參數:
// filterContext:
// 篩選器上下文。
void OnActionExecuted(ActionExecutedContext filterContext);
//
// 摘要:
// 在執行操作方法之前調用。
//
// 參數:
// filterContext:
// 篩選器上下文。
void OnActionExecuting(ActionExecutingContext filterContext);
}
}
我們看到該接口里有兩個方法OnActionExecuting和OnActionExecuted,前者在動作方法執行前調用,后者在動作方法執行后調用。
OnActionExecuting方法
我們已經知道了OnActionExecuting方法實在動作方法調用之前被,調用的那么我們就可以利用這個方法來檢測請求,並且可以在這里修改請求,取消請求,在OnActionExecuting方法中傳遞的參數是一個ActionExecutingContext對象,它繼承於ControllerContext類,它的屬性如下:
| 名稱 | 類型 | 說明 |
|---|---|---|
| ActionDescriptor | ActionDescriptor | 獲取或設置操作描述符。 |
| ActionParameters | IDictionary<string, object> | 獲取或設置操作方法參數。 |
| Result | ActionResult | 獲取或設置由操作方法返回的結果。 |
執行OnActionExecuting方法
下面我將演示OnActionExecuting方法,首先我們還是在之前的Filter文件夾下添加一個名為 CustomActionAttribute.cs 的過濾器類,我們繼承 FilterAttribute 類和 IActionFilter 接口,為了方便演示,我們簡單處理,判斷請求類型,如果是GET請求那么我們讓其拋出404錯誤。
這是我們在 CustomActionAttribute.cs 文件中編寫的代碼
public class CustomActionAttribute : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "get", StringComparison.CurrentCultureIgnoreCase))
{
filterContext.Result = new HttpNotFoundResult();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
因為創建動作過濾器需要實現IActionFilter接口中的兩個方法,如果不需要實現邏輯我們可以先讓其空着,因為MVC框架對動作過濾器中的兩個方法都會調用。
接着我們在Home控制器里添加一個方法方法會直接在頁面輸出“執行方法”這幾個字,接着我們在方法上應用,我們的動作過濾器
[CustomAction]
public ActionResult GetText()
{
ViewBag.Message = "執行方法";
return View();
}
好了我們允許程序,並且在瀏覽器里直接請求我們這個方法,我們看看效果

OnActionExecuted方法
OnActionExecuted方法在動作方法執行后調用,傳遞給OnActionExecuted方法的參數是ActionExecutedContext對象。這個類相比我們之前的ActionExecutingContext對象而言多了些屬性,它的屬性如下:
| 名稱 | 類型 | 說明 |
|---|---|---|
| ActionDescriptor | ActionDescriptor | 獲取或設置操作描述符。 |
| Canceled | bool | 獲取或設置一個值,該值指示此ActionExecutedContext 對象已被取消。 |
| Exception | Exception | 獲取或設置在操作方法的執行過程中發生的異常(如果有)。 |
| ExceptionHandled | bool | 獲取或設置一個值,該值指示是否處理異常。 |
| Result | ActionResult | 獲取或設置由操作方法返回的結果。 |
執行OnActionExecuted方法
我們可以通過OnActionExecuted方法來執行一些跨越動作方法的任務,比如我們可以用它來獲取動作方法執行的時間。我們修改 CustomActionAttribute.cs 過濾器代碼如下:
public class CustomActionAttribute : FilterAttribute, IActionFilter
{
private Stopwatch timer;
public void OnActionExecuting(ActionExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
timer.Stop();
if (filterContext.Exception == null)
{
filterContext.HttpContext.Response.Write($"<div>方法執行時間:{timer.Elapsed.TotalSeconds:F6}s</div>");
}
}
}
我們在方法啟動之前啟動了一個計時器並在方法執行后停止了它,並且將這個時間間隔輸出到我們的頁面上。

