Action Filters là một tính năng của ASP.NET MVC cho phép bạn tạo các đoạn mã được thực thi trước hoặc sau khi một action được thực thi. Action Filters cung cấp cho bạn khả năng kiểm soát và can thiệp vào quá trình xử lý request và response của một action.
Các loại Action Filters khác nhau bao gồm:
- Authorization Filters: Cho phép bạn kiểm tra quyền truy cập của người dùng trước khi cho phép họ truy cập một action.
- Action Filters: Cho phép bạn can thiệp vào quá trình xử lý của một action bằng cách thực thi đoạn mã trước hoặc sau khi action được gọi.
- Result Filters: Cho phép bạn can thiệp vào quá trình xử lý của một result trả về từ action bằng cách thực thi đoạn mã trước hoặc sau khi result được trả về cho client.
- Exception Filters: Cho phép bạn xử lý các exception xảy ra trong quá trình xử lý một action.
Bạn có thể tạo các Action Filters tùy chỉnh của riêng mình bằng cách kế thừa từ lớp ActionFilterAttribute hoặc từ các lớp Filter cơ bản khác như AuthorizeAttribute, RequireHttpsAttribute, và nhiều hơn nữa.
1. Tạo một class filter kế thừa từ ActionFilterAttribute, ví dụ:
public class CustomActionFilter : ActionFilterAttribute {
// implementation here
}
2. Thêm code xử lý của mình vào các phương thức của class filter.
Ví dụ, nếu bạn muốn log thời gian thực hiện của các action trong controller, bạn có thể thêm đoạn code sau vào class filter:
public override void OnActionExecuting(ActionExecutingContext filterContext) {
var watch = new Stopwatch();
watch.Start();
base.OnActionExecuting(filterContext);
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
var actionName = filterContext.ActionDescriptor.ActionName;
// log elapsed time to your logging system
// example: log.Info($"Action '{actionName}' took {elapsedMs} ms.");
}
3. Áp dụng filter cho một action hoặc tất cả các action trong một controller bằng cách:
Đối với áp dụng cho tất cả các action trong một controller, bạn có thể thêm [CustomActionFilter] trực tiếp lên đầu controller:
[CustomActionFilter]
public class MyController : Controller {
// controller code here
}
4. Đối với áp dụng cho một action, bạn có thể thêm [CustomActionFilter] trực tiếp lên đầu action:
public class MyController : Controller {
[CustomActionFilter]
public ActionResult MyAction() {
// action code here
}
}
Lưu ý rằng để sử dụng filter, bạn cần phải bật tính năng filter trong ứng dụng của mình bằng cách thêm đoạn code sau vào phương thức RegisterGlobalFilters trong file Global.asax.cs:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
filters.Add(new CustomActionFilter()); // add your custom filter here
}
Chúc bạn thành công!