|
En caso de que los filtros introducidos anteriormente no cumplan los requisitos, este filtro personalizado debería ser útil si quieres definir tu propia lógica de procesamiento antes y después de ejecutar y devolver el método de comportamiento. Para personalizar un filtro, se hereda la clase ActionFilterAttribute, que es una clase abstracta que implementa las interfaces IActionFilter e IResultFilter, principalmente reescribiendo los cuatro métodos virtuales para lograr la lógica de inyección antes y después de la ejecución y devolución del método de comportamiento método | parámetro | descripción | AcciónEjecutando | AcciónEjecutandoContexto | Ejecutar antes de que se ejecute el método conductual | AcciónEjecutada | AcciónEjecutadoContexto | Ejecutar después de ejecutar el método conductual | OnResultExecuting | ResultExecutingContext | Ejecutar antes de que el método de comportamiento devuelva | OnResultExecuted | ResultExecutedContext | Ejecutar después de que se devuelva el método de comportamiento |
Los cuatro métodos se ejecutan en el orden de OnActionExecuting>OnActionExecuted>OnResultExecuting>OnResultExecuted. Los argumentos de los cuatro métodos anteriores se heredan de la clase ContollorContext. Por ejemplo, a continuación se define un filtro personalizado
- 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;
- }
- }
Copiar código
Los métodos conductuales para su uso se definen a continuación - [MyCustomerFilter]
- public ActionResult CustomerFilterTest()
- {
- Response.Write("<br/>Invking CustomerFilterTest Action");
- return View();
- }
Copiar código
|