ASP.NET MVC - 實作 ActionFilter

摘要: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