雖然 AOP (Aspect-Oriented Programming) 概念源自 Java Spring,但在 ASP.NET MVC 中同樣可透過 ActionFilterAttribute 實現橫切關注點的模組化。本文以實戰代碼示範如何建立自訂 Filter、控制執行順序、實現 Controller/Action/全域三層級攔截,並解決多重 Filter 疊加不生效的常見坑點。
using System.Web.Mvc;
public class FilterPublicAttribute : ActionFilterAttribute {
public string Message { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext) {
base.OnActionExecuting(filterContext);
filterContext.HttpContext.Response.Write($"Action執行之前 {Message} <br/>");
}
public override void OnActionExecuted(ActionExecutedContext filterContext) {
base.OnActionExecuted(filterContext);
filterContext.HttpContext.Response.Write($"Action執行之後 {Message} <br/>");
}
public override void OnResultExecuting(ResultExecutingContext filterContext) {
base.OnResultExecuting(filterContext);
filterContext.HttpContext.Response.Write($"前往Result之前 {Message} <br/>");
}
public override void OnResultExecuted(ResultExecutedContext filterContext) {
base.OnResultExecuted(filterContext);
filterContext.HttpContext.Response.Write($"前往Result之後 {Message} <br/>");
}
}
[FilterPublic(Message = "Action")]
public ActionResult Index() {
HttpContext.Response.Write("Action正在執行···<br/>");
return Content("正在前往Result···<br/>");
}
AllowMultiple = true)[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class FilterPublicAttribute : ActionFilterAttribute { ... }
[FilterPublic(Message = "Controller")]
public class HomeController : Controller { ... }
public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
public class FilterConfig {
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
filters.Add(new FilterPublicAttribute { Message = "全域<br/>" });
}
}
套用三層後,輸出順序嚴格遵循:
Action執行之前全域 Action執行之前Controller Action執行之前Action Action正在執行··· Action執行之後Action Action執行之後Controller Action執行之後全域 前往Result之前全域 前往Result之前Controller 前往Result之前Action 正在前往Result··· 前往Result之後Action 前往Result之後Controller 前往Result之後全域
若不在自訂 Attribute 加上 [AttributeUsage(AttributeTargets.All, AllowMultiple = true)],Controller 層級與全域層級的同類 Filter 會互相覆蓋,導致只有最內層 (Action) 生效。此屬性允許同一目標套用多個相同類型的 Attribute。
OnActionExecuting 檢查 Session/Token,失敗 filterContext.Result = new RedirectResult("/Login")。HandleErrorAttribute 或實作 IExceptionFilter。OnResultExecuting 設定 Response Headers。OnActionExecuting 解析 Accept-Language 設定 Culture。ASP.NET MVC 的 ActionFilterAttribute 提供了輕量級 AOP 能力,透過四個生命週期方法精確控制攔截點。掌握 三層級套用順序 與 AllowMultiple 疊加機制,即可實現權限、日誌、快取等橫切關注點的乾淨分離,避免 Controller 膨脹與代碼重複。