2011-07-18 9 views
12

Tengo un filtro de acción con la siguiente firmacomportamiento extraño con la acción asp.net mvc filtra AttributeUsage

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class UnitOfWorkAttribute : ActionFilterAttribute 

De acuerdo con MSDN:

La propiedad allowMultiple indica si varias instancias de su atributo puede existir en un elemento. Si se establece en verdadero, se permiten múltiples instancias ; si se establece en falso (valor predeterminado), solo se permite una instancia de .

En MVC el comportamiento parece un poco extraño. Cuando decoré una acción con este atributo, encontré que el método OnActionExecuting del filtro se ejecutó dos veces.

El filtro solo se declaró en la acción, no en el controlador, y eliminé todos los filtros globales. ¿Podría alguien explicar este comportamiento?

+0

¿Es simplemente _AllowMultiple_ el que provocará que _OnActionExecuting_ se llame dos veces, o de hecho decoraste tu acción con dos instancias del atributo? – Codo

+0

@Codo, no, no necesito varias instancias, por lo que configurar AllowMultiple en false resuelve el problema, pero no lo explica. Posiblemente un error en asp.net mvc? –

+0

la acción realmente no se disparó dos veces? solo el atributo? – dknaack

Respuesta

29

Tuve el mismo problema. (He instalado un filtro global (sólo una vez) y descubrí que sus IActionFilter y IResultFilter métodos estaban siendo llamado dos veces para cada solicitud. El objeto filterContext.HttpContext se pasa a estos métodos era exactamente el mismo para ambas llamadas.)

Esto resultó ser debido al uso de Html.Action en la vista. Parece (al mirar la pila de llamadas) que al llamar Html.Action se procesa de manera reentrante el método de acción hijo (durante el procesamiento del método de acción inicial) y se invocan los filtros para ambos.

Puede detectar esta situación marcando la propiedad filterContext.IsChildAction.

+0

Salvaste mi día :-) –

+0

¡Muchísimas gracias! Exactamente lo que necesitaba. – Vindberg

+0

Es genial que esto funcionó, pero ¿por qué lo está haciendo?Estoy pensando en todas las aplicaciones que usaron filtros de acción personalizados y estoy preocupado. –

0

He tenido el método OnActionExecuting de mi clase de filtro de acción personalizada ejecutándose dos veces también.

En algún momento he añadido esto a mi método de Application_Start en el archivo global.asax.cs:

GlobalConfiguration.Configuration.Filters.Add(new MyCustomActionFilter()); 

Al parecer, mi filtro de acción ya ha sido añadido a la colección Filters que fue llevando a la doble llamada a OnActionExecuting y OnActionExecuted. Entonces esa línea en el applicaton_start no era necesaria.

Cuestiones relacionadas