|
Mocht de eerder geïntroduceerde filters niet aan de eisen voldoen, dan is dit aangepaste filter handig als je je eigen verwerkingslogica wilt definiëren vóór en na het uitvoeren en teruggeven van de gedragsmethode. Om een filter aan te passen, erf je de ActionFilterAttribut-klasse, een abstracte klasse die de interfaces IAectionFilter en IResultFilter implementeert, voornamelijk door de vier virtuele methoden te herschrijven om injectielogica te bereiken vóór en na de uitvoering en terugkeer van de gedragsmethode methode | parameter | beschrijving | OnActionUitvoeren | ActieUitvoeringContext | Voer uit voordat de gedragsmethode wordt uitgevoerd | OnActionUitgevoerd | ActieUitgevoerdContext | Voer uit nadat de gedragsmethode is uitgevoerd | OnResultExecuting | ResultaatUitvoeringContext | Voer uit voordat de gedragsmethode terugkeert | OnResultUitgevoerd | ResultExecutedContext | Voer uit nadat de gedragsmethode is teruggegeven |
De vier methoden worden uitgevoerd in de volgorde OnActionExecuting>OnActionExecuted>OnResultExecuting>OnResultExecuted. De argumenten van de bovenstaande vier methoden zijn overgenomen van de ContollorContext-klasse. Bijvoorbeeld, een aangepaste filter wordt hieronder gedefinieerd
- 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;
- }
- }
Code kopiëren
De gedragsmethoden voor het gebruik ervan worden hieronder gedefinieerd - [MyCustomerFilter]
- public ActionResult CustomerFilterTest()
- {
- Response.Write("<br/>Invking CustomerFilterTest Action");
- return View();
- }
Code kopiëren
|