2012-05-03 17 views
17

Estoy creando un ActionFilterAttribute personalizado para transformar ViewResult sy redirige a JsonResult s durante las solicitudes ajax. Lo conecté casi por completo a través de pruebas unitarias y, por alguna razón, suponiendo que mi transformación tuviera que tener lugar en OnResultExecuting, me di cuenta de que no era así, y el método correcto para sobrescribir era OnActionExecuted, que se llama tan pronto como el método de acción devuelve un resultado.¿Cuándo exactamente OnResultExecuted y OnResultExecuting disparan?

Mi pregunta es cuando son exactamente OnResultExecuted y OnResultExecuting ser llamado desde que he puntos de interrupción en los cuatro anulaciones y sólo aquellos en los OnActionExecuting y OnActionExecuted están disparando en absoluto.

Respuesta

12

Tomemos el siguiente ejemplo que lleva a cabo la transformación que ha descrito:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      var result = filterContext.Result as ViewResultBase; 
      if (result != null && result.Model != null) 
      { 
       filterContext.Result = new JsonResult 
       { 
        Data = result.Model, 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet 
       }; 
      } 
     } 
    } 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
    } 
} 

El método OnResultExecuting será invocado inmediatamente antes ExecuteResult ejecuta el método del resultado de la acción y el método OnResultExecuted inmediatamente después.

Cuestiones relacionadas