Reputation: 11304
I have 2 action filters "ActionFilter1" & "ActionFilter2,
public class ActionFilter1 : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext.Current.Application["Order"] += "Action 1: OnActionExecuting <br/>";
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
HttpContext.Current.Application["Order"] += "Action 1: OnActionExecuted <br/>";
}
}
public class ActionFilter2 : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext.Current.Application["Order"] += "Action 2: OnActionExecuting <br/>";
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
HttpContext.Current.Application["Order"] += "Action 2: OnActionExecuted <br/>";
}
}
I applied both filters on an controller action method with "Order",
[ActionFilter1(Order = 1)]
[ActionFilter2(Order = 2)]
public ActionResult Index()
{
return View();
}
While Page is executed on browser, I got below output of action filters executing,
Action 1: OnActionExecuting
Action 2: OnActionExecuting
Action 2: OnActionExecuted
Action 1: OnActionExecuted
Question - Why "OnActionExecuted" execute in reverse order, while "OnActionExecuting" order is correct as I supplied in attribute?
Thanks,
Upvotes: 1
Views: 319
Reputation: 24901
This is documented behavior. Here is the link on MSDN:
The OnActionExecuting(ActionExecutingContext), OnResultExecuting(ResultExecutingContext), and OnAuthorization(AuthorizationContext) filters run in forward order. The OnActionExecuted(ActionExecutedContext), OnResultExecuting(ResultExecutingContext), and OnException(ExceptionContext) filters run in reverse order.
Upvotes: 3