2011-05-27 16 views
11

que define dos ActionFilters:¿Solicita la propiedad de ActionFilter, de menor a mayor o viceversa?

[DefaultResources(Order = 2)] 
[RenderTemplate(Order = 1)] 

y para mi sorpresa DefaultResources se ejecuta antes de RenderTemplate. Pero de acuerdo a la documentación de MSDN que debería funcionar al revés:

[Filter1(Order = 2)] 
[Filter2(Order = 3)] 
[Filter3(Order = 1)] 
public void Index() 
{ 
    View("Index"); 
} 

En este ejemplo, los filtros de acción serían ejecutar en el siguiente orden: Filtro3, Filter1, y luego Filtro2.

Estoy usando .NET 4. Y comparando por el método OnActionExecuted. ¿Me estoy perdiendo de algo? Gracias.

Respuesta

22

Last-in First-out order

Esta es la respuesta que estaba buscando. Orden de OnActionExecuted es orden inverso de OnActionExecuting ...

+0

¿Por qué es Filter1, Filter2, Filter3 (como se muestra en el diagrama de su respuesta) y no Filter3, Filter1, Filter2 (por la intención aparente de sus argumentos de atributo "order =" de su pregunta? – Mishax

1

Todo depende de lo que implemente cada filtro.

Si DefaultResource implementa OnActionExecuting o OnActionExecuted, se activará primero si RenderTemplate no lo hace.

Para más detalles ver:

http://www.gregshackles.com/2010/09/custom-ordering-of-action-filters-in-asp-net-mvc/

y

http://msdn.microsoft.com/en-us/library/dd381609.aspx

"El marco ASP.NET MVC llamará al método OnActionExecuting de su filtro de la acción antes de que llama a cualquier método de acción eso está marcado con su atributo de filtro de acción. Del mismo modo, el marco llamará al método OnActionExecuted una vez que el método de acción haya finalizado. "

+0

Los únicos métodos implementados son OnActionExecuted en ambos ActionFilters, como escribí antes. Otra diferencia, que podría ser posible (pero en mi humilde opinión muy poco probable) porque esto es, que DefaultResource se implementa en el proyecto de aplicación MVC y el otro se define en el proyecto vinculado. –

+1

Para más puedo decir definitivamente, ese cambio de valor de orden hace orden diferente. P.ej. DefaultResource (Order = 2) RenderTemplate (Order = 3) la primera vez que se ejecutó fue RenderTemplate, no tiene sentido haber leído msdn y gregshackles ... –

0

Consulte Filtering in ASP.NET MVC para obtener una explicación completa de lo que determina el orden de ejecución de los filtros de acción y sus métodos.

En cuanto OnResultExecuted, que dijiste a tus filtros están utilizando, consulte los siguientes:

Los OnActionExecuting(ActionExecutingContext), OnResultExecuting(ResultExecutingContext) y OnAuthorization(AuthorizationContext) filtros ejecutan en orden hacia adelante. Los filtros OnActionExecuted(ActionExecutedContext), OnResultExecuting(ResultExecutingContext) y OnException(ExceptionContext) se ejecutan en orden inverso.

El pedido es realmente bastante complejo, así que échele un vistazo al artículo para obtener más detalles.

Cuestiones relacionadas