I'm creating a custom ActionFilterAttribute
in order to transform ViewResult
s and redirects into JsonResult
s during ajax requests. I've wired most of it through unit testing and I was for some reason assuming my transformation had to take place in OnResultExecuting
, I realized this was not the case, and the correct method to override was OnActionExecuted
, which is called as soon as the action method returns a result.
My question is when exactly are OnResultExecuted
and OnResultExecuting
being called since I've breakpoints in all four overrides and only the ones in OnActionExecuting
and OnActionExecuted
are firing at all.
OnResultExecuting has a ResultExecutingContext. This method gets called just before the ActionResult instance is invoked. You can examine the result of the method and possibly cancel the execution of the result. This will usually result in a blank response with status code 200.
OnActionExecuting – This method is called before a controller action is executed. OnActionExecuted – This method is called after a controller action is executed. OnResultExecuting – This method is called before a controller action result is executed.
Let's take the following example which performs the transformation you described:
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) { } }
The OnResultExecuting
method will be invoked immediately before the action result's ExecuteResult
method runs and the OnResultExecuted
method immediately after.
After looking for a while and trying to understand the accepted answer I found this. I believe this shows the order of Execution to be
Check this link under listing 2. http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With