ASP.NET - MVC - ActionFilters
Action Filters (Bộ lọc hành động) trong MVC ASP.NET
Trong phần trước, bạn đã tìm hiểu về các bộ lọc trong MVC. Trong phần này, bạn sẽ tìm hiểu về một loại bộ lọc khác gọi là Action Filters trong ASP.NET MVC.
Action filter thực thi trước và sau khi phương thức hành động thực thi. Các thuộc tính Action filter có thể được áp dụng cho một phương thức hành động riêng lẻ hoặc chocontroller. Khi Action filterg được áp dụng cho controller thì nó sẽ được áp dụng cho tất cả các phương thức hành động trong controller đó.
OutputCache là một thuộc tính bộ lọc hành động tích hợp có thể được áp dụng cho một phương thức hành động mà chúng ta muốn lưu trữ đầu ra. Ví dụ: đầu ra của phương thức hành động sau sẽ được lưu trong bộ nhớ cache trong 100 giây.
Ví dụ: ActionFilter
[OutputCache(Duration=100)]
public ActionResult Index()
{
return View();
}
Bạn có thể tạo bộ lọc hành động tùy chỉnh cho ứng dụng của bạn. Hãy xem cách tạo các bộ lọc hành động tùy chỉnh.
Custom Action Filter
Bạn có thể tạo bộ lọc hành động tùy chỉnh theo hai cách. Đầu tiên, bằng cách triển khai giao diện IActionFilter và lớp FilterAttribution. Thứ hai, bằng cách lấy lớp trừu tượng ActionFilterAttribution.
Giao diện IActionFilter bao gồm các phương thức sau để thực hiện:
- void OnActionExecuted(ActionExecutedContext filterContext)
- void OnActionExecuting(ActionExecutingContext filterContext)
Lớp trừu tượng ActionFilterAttribution bao gồm các phương thức sau để ghi đè:
- void OnActionExecuted(ActionExecutedContext filterContext)
- void OnActionExecuting(ActionExecutingContext filterContext)
- void OnResultExecuted(ResultExecutedContext filterContext)
- void OnResultExecuting(ResultExecutingContext filterContext)
Như bạn có thể thấy rằng lớp ActionFilterAttribution có bốn phương thức để quá tải. Nó bao gồm các phương thức OnResultExecuted và OnResultExecuting, có thể được sử dụng để thực thi logic tùy chỉnh trước hoặc sau khi thực hiện kết quả. Các bộ lọc hành động thường được sử dụng để áp dụng các mối quan tâm xuyên suốt như: logging, caching, authorization etc.
Hãy xem xét lớpLog filter sau đây để ghi.
Ví dụ: Custom ActionFilter
public class LogAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting ", filterContext.RouteData);
}
private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0}- controller:{1} action:{2}", methodName,
controllerName,
actionName);
Debug.WriteLine(message);
}
}
Như bạn có thể thấy, lớp Log dẫn xuất lớp ActionFilterAttribution. Nó ghi log trước và sau khi phương thức hành động hoặc kết quả thực thi. Bạn có thể áp dụng thuộc tính Log cho bất kỳ TController hoặc phương thức hành động nào mà bạn muốn đăng nhập hành động. Ví dụ: bằng cách áp dụng thuộc tính Log cho Controller , nó sẽ ghi log từng phương thức hành động của Controller đó.
Ví dụ: Apply Log ActionFilter cho Controller
[Log]
public class StudentController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
public ActionResult Contact()
{
return View();
}
}
ví dụ trên sẽ hiển thị output trong cửa sổ output của Visual Studio theo yêu cầu http://localhost/student request.
Output:
OnActionExecuting- controller:Home action:Index
OnActionExecuted- controller:Home action:Index
OnResultExecuting - controller:Home action:Index
OnResultExecuted- controller:Home action:Index