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