Ответ 1
Это ответ, который я искал. Заказ OnActionExecuted - это обратный порядок OnActionExecuting...
Я определил два ActionFilters:
[DefaultResources(Order = 2)]
[RenderTemplate(Order = 1)]
И к моему удивлению DefaultResources выполняется перед RenderTemplate. Но согласно документации MSDN она должна работать наоборот:
[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
View("Index");
}
В этом примере фильтры действий выполнить в следующем порядке: Filter3, Filter1, а затем Filter2.
Я использую .NET 4. И сравнение методом OnActionExecuted. Я что-то упускаю? Спасибо.
Это ответ, который я искал. Заказ OnActionExecuted - это обратный порядок OnActionExecuting...
Все зависит от того, что реализует каждый фильтр.
Если DefaultResource реализует OnActionExecuting или OnActionExecuted, тогда он срабатывает первым, если RenderTemplate этого не делает.
Подробнее см.:
http://www.gregshackles.com/2010/09/custom-ordering-of-action-filters-in-asp-net-mvc/
и
http://msdn.microsoft.com/en-us/library/dd381609.aspx
"Структура ASP.NET MVC вызовет метод OnActionExecuting фильтра действий, прежде чем он вызовет какой-либо метод действий, отмеченный атрибутом фильтра действия. Аналогично, инфраструктура вызовет метод OnActionExecuted после завершения действия."
См. Фильтрация в ASP.NET MVC для полного объяснения того, что определяет порядок выполнения фильтров действий и их методов.
Относительно OnResultExecuted
, который вы сказали, что ваши фильтры используют, см. следующее:
Фильтры
OnActionExecuting(ActionExecutingContext)
,OnResultExecuting(ResultExecutingContext)
иOnAuthorization(AuthorizationContext)
выполняются в прямом порядке. ФильтрыOnActionExecuted(ActionExecutedContext)
,OnResultExecuting(ResultExecutingContext)
иOnException(ExceptionContext)
выполняются в обратном порядке.
Заказы на самом деле довольно сложны, поэтому более подробно см. статью.