1. 程式人生 > >【asp.net core 系列】10 實戰之ActionFilter

【asp.net core 系列】10 實戰之ActionFilter

# 0.前言 在上一篇中,我們提到了如何建立一個UnitOfWork並通過ActionFilter設定啟用。這一篇我們將簡單介紹一下ActionFilter以及如何利用ActionFilter,順便補齊一下上一篇的工具類。 # 1. ActionFilter 介紹 ActionFilter全稱是ActionFilterAttribute,我們根據微軟的命名規範可以看出這是一個特性類,看一下它的宣告: ```c# [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public abstract class ActionFilterAttribute : Attribute, IActionFilter, IFilterMetadata, IAsyncActionFilter, IAsyncResultFilter, IOrderedFilter, IResultFilter ``` 這是一個允許標註在類和方法上的特性類,允許多個標記,標註之後子類會繼承父類的特性。然後,這個類是一個抽象類,所以我們可以通過繼承ActionFilterAttribute來編寫自己的ActionFilter。 ## 1.1 ActionFilter的四個方法 對於一個ActionFilter而言,最重要的是它的四個方法: ```c# public virtual void OnActionExecuted(ActionExecutedContext context); public virtual void OnActionExecuting(ActionExecutingContext context); public virtual void OnResultExecuted(ResultExecutedContext context); public virtual void OnResultExecuting(ResultExecutingContext context); ``` ![image-20200615231334442](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200618054026637-2001331197.png) 上圖是這四個方法在一次請求中執行的順序。在一次請求真正執行之前,想要攔截這個請求,應該使用`OnActionExecuting`。 為什麼單獨說這個呢?因為這個方法的出鏡率很高,大多數時候都會使用這個方法進行請求過濾。 ## 1.2 在ActionFilter中我們能做什麼 我們來簡單介紹一下,四個方法中的四種上下文型別,看一看裡面有哪些我們可以利用的方法: ### 1.2.1 ActionExecutingContext 這是一個Action執行前的上下文,表示Action並未開始執行,但是已經獲取到了控制器例項: ```c# public class ActionExecutingContext : FilterContext { public virtual IDictionary