摘要:ASP.NET MVC - 實作 ActionFilter
在開發 ASP.NET MVC 專案時,我們可能會需要在 Action 或 Action Result 的前後做一些商業邏輯運算,或者是當發生異常時,將其導向到設計過的 Error 頁面,要達到這些功能就可以使用 ActionFilter 來完成,以下就來說明並實作 ActionFilter 吧...
在 ActionFilterAttribute 中有提供四個覆蓋方法 
OnActionExecuting – 在執行 Action 之前執行
OnActionExecuted – 在執行 Action 之後執行
OnResultExecuting – 在執行 Action Result 之前執行
OnResultExecuted – 在執行 Action Result 之後執行
步驟一:在專案中建立一名為「ActionFilter」的資料夾,並在資料夾中建立一個名為「LogActionFilterAttribute」的 Class
步驟二:讓 LogActionFilterAttribute 繼承 ActionFilterAttribute
Code:
using System.Web.Mvc;
namespace MVC_ActionFilter.ActionFilter
{
    public class LogActionFilterAttribute : ActionFilterAttribute
    {
    }
}
步驟三:建立 OnActionExecuting、OnActionExecuted、OnResultExecuting 與 OnResultExecuted
Code:
public class LogActionFilterAttribute : ActionFilterAttribute
{
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
  
 }
 public override void OnActionExecuted(ActionExecutedContext filterContext)
 {
}
 public override void OnResultExecuting(ResultExecutingContext filterContext)
 {
}
 public override void OnResultExecuted(ResultExecutedContext filterContext)
 {
  
 }
}
步驟四:撰寫一個簡單功能,對一個名為「ActionFilter.log」的檔案寫入每一個方法的名稱與執行時間
Code:
using System.Web.Mvc;
using System.Threading;
using System.IO;
namespace MVC_ActionFilter.ActionFilter
{
    public class LogActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            File.AppendAllText(@"C:ActionFilter.log", 
                "方法:OnActionExecuting、執行時間:" + 
                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "rn");
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Thread.Sleep(3000);
            File.AppendAllText(@"C:ActionFilter.log",
                "方法:OnActionExecuted、執行時間:" + 
                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "rn");
        }
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Thread.Sleep(3000);
            File.AppendAllText(@"C:ActionFilter.log",
                "方法:OnResultExecuting、執行時間:" + 
                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "rn");
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Thread.Sleep(3000);
            File.AppendAllText(@"C:ActionFilter.log",
                "方法:OnResultExecuted、執行時間:" + 
                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "rn");
        }
    }
}
步驟五:在「HomeController」的 Index 方法加上 Attribute
Code:
using MVC_ActionFilter.ActionFilter;
namespace MVC_ActionFilter.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        [LogActionFilterAttribute]
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
            return View();
        }
        public ActionResult About()
        {
            return View();
        }
    }
}
結果:


參考:
Understanding Action Filters