|
もし先に紹介したフィルターが要件を満たしていない場合、このカスタムフィルターは、動作メソッドの実行前後に自分で処理ロジックを定義したい場合に役立ちます。 フィルターをカスタマイズするには、ActionFilterAttributeクラスを継承します。これはIActionFilterとIResultFilterのインターフェースを実装する抽象クラスで、主に4つの仮想メソッドを書き換え、動作メソッドの実行と返還の前後に注入ロジックを実現する仕組みです 方式 | パラメーター | 形容 | OnActionExecuting | ActionExecutingContext | 動作メソッドが実行される前に実行してください | OnActionExecuted(実行された行動)です | ActionExecutedContext | 振る舞いメソッドが実行された後に実行 | OnResultExecuting | 結果実行コンテキスト | 振る舞いメソッドが戻る前に実行してください | OnResultExecuted | 結果実行コンテキスト | 行動メソッドが返された後に実行 |
4つのメソッドは、OnActionExecuting>OnActionExecuted>OnResultExecuting>OnResultExecutedの順番で実行されます。 上記の4つのメソッドの引数は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();
- }
コードをコピーします
|