Заказать свойство ActionFilter, от самого низкого до большого или наоборот?

Я определил два 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. Я что-то упускаю? Спасибо.

Ответ 1

Last-in First-out order

Это ответ, который я искал. Заказ OnActionExecuted - это обратный порядок OnActionExecuting...

Ответ 2

Все зависит от того, что реализует каждый фильтр.

Если 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 после завершения действия."

Ответ 3

См. Фильтрация в ASP.NET MVC для полного объяснения того, что определяет порядок выполнения фильтров действий и их методов.

Относительно OnResultExecuted, который вы сказали, что ваши фильтры используют, см. следующее:

Фильтры OnActionExecuting(ActionExecutingContext), OnResultExecuting(ResultExecutingContext) и OnAuthorization(AuthorizationContext) выполняются в прямом порядке. Фильтры OnActionExecuted(ActionExecutedContext), OnResultExecuting(ResultExecutingContext) и OnException(ExceptionContext) выполняются в обратном порядке.

Заказы на самом деле довольно сложны, поэтому более подробно см. статью.