|
앞서 소개한 필터들이 요구사항을 충족하지 못할 경우, 이 커스텀 필터가 동작 메서드를 실행하고 반환되기 전후에 자신만의 처리 로직을 정의하고 싶을 때 유용할 것입니다. 필터를 커스터마이즈하려면 ActionFilterAttribute 클래스를 상속하는데, 이는 IActionFilter와 IResultFilter 인터페이스를 구현하는 추상 클래스로, 주로 동작 메서드 실행 및 반환 전후에 주입 논리를 구현하기 위해 네 가지 가상 메서드를 다시 작성함으로써 이루어집니다 메서드 | 매개 변수 | 묘사 | OnActionExecuting | 액션실행컨텍스트 | 동작 메서드가 실행되기 전에 실행하세요 | 실행된 행동 | ActionExecutedContext | 행동 메서드가 실행된 후 실행됩니다 | OnResultExecuting | 결과실행컨텍스트 | 행동 메서드가 반환되기 전에 실행하세요 | 결과실행됨 | 결과실행컨텍스트 | 동작 메서드가 반환된 후 실행하세요 |
네 가지 메서드는 OnActionExecuting>OnActionExecuted>OnResultExecuting>OnResultExecuted 순서로 실행됩니다. 위 네 가지 방법의 인수는 ContollorContext 클래스에서 유래한 것입니다. 예를 들어, 아래에는 맞춤형 필터가 정의되어 있습니다
- public class MyCustomerFilterAttribute : ActionFilterAttribute
- {
- public string Message { get; set; }
- public override void OnActionExecuted(ActionExecutedContext filterContext)
- {
- base.OnActionExecuted(filterContext);
- filterContext.HttpContext.Response.Write(string.Format( "<br/> {0} Action finish Execute.....",Message));
- }
- public override void OnActionExecuting(ActionExecutingContext filterContext)
- {
- CheckMessage(filterContext);
- filterContext.HttpContext.Response.Write(string.Format("<br/> {0} Action start Execute.....", Message));
- base.OnActionExecuting(filterContext);
- }
- public override void OnResultExecuted(ResultExecutedContext filterContext)
- {
- filterContext.HttpContext.Response.Write(string.Format("<br/> {0} Action finish Result.....", Message));
- base.OnResultExecuted(filterContext);
- }
- public override void OnResultExecuting(ResultExecutingContext filterContext)
- {
- filterContext.HttpContext.Response.Write(string.Format("<br/> {0} Action start Execute.....", Message));
- base.OnResultExecuting(filterContext);
- }
- private void CheckMessage(ActionExecutingContext filterContext)
- {
- if(string.IsNullOrEmpty( Message)||string.IsNullOrWhiteSpace(Message))
- Message = filterContext.Controller.GetType().Name + "'s " + filterContext.ActionDescrip{过滤}tor.ActionName;
- }
- }
코드 복사
이를 사용하는 행동 방법은 아래에 정의되어 있습니다 - [MyCustomerFilter]
- public ActionResult CustomerFilterTest()
- {
- Response.Write("<br/>Invking CustomerFilterTest Action");
- return View();
- }
코드 복사
|