2011-06-28 20 views
14

Hola, estoy tratando de hacer algo que parece algo fácil, y está documentado de esa manera, pero por alguna razón no es tan fácil.ASP.NET MVC ActionFilterAttribute personalizado - los ganchos nunca se llaman

Basiclly me escribió algo como esto:

public class CacheControllAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     //do something 
     base.OnResultExecuting(filterContext); 
    } 
} 

Sin embargo cuando intento de usar esto contra un resultado acción como esta:

[CacheControllAttribute] 
public ActionResult SomeAction() 
{ 
    //whatever 
} 

Mi función anulado a medida nunca se llama ...

alguna idea sobre esto? o cómo implementar esto de manera diferente?

+0

Parece correcto. ¿Qué versión de MVC estás usando? – LeftyX

+0

Este es MVC 2, estoy empezando a pensar que tal vez algo más está deteniendo filtros de ejecuciones o algo así, ¿puede ser trazable como el flujo de ejecución completo de alguna manera? – aromasca

+0

Tenía exactamente el mismo problema. Incluso cuando agregué el filtro en globalFilterCollection, recibí un error que decía que debía implementar el filtro de IActionFilter. Después de un tiempo descubrí que estaba usando System.Web. ** Http.Filters **. IActionFilter and System.Web. ** Http.Filters **. ActionFilterAttribute en lugar del System.Web correcto. ** Mvc * * .IActionFilter y System.Web. ** Mvc **. ActionFilterAttribute Mayby eso ayudará a alguien. –

Respuesta

4

finalmente descubrió, fue al final el hecho de que he estado poniendo el filtro en una función que ha sido en realidad una función ActionResult, pero fue devuelto por otro método que lo llamó, por lo que los filtros solo se ejecutan una vez en el punto de entrada Acción.

0

Ideas:

Es usted positivo el filtro no está funcionando? ¿Has puesto un punto de quiebre? ¿Estás seguro de que no está tirando y es una excepción? ¿Estás seguro de que la acción que decoraste en realidad se llama getting?

implementación diferente:

reemplazar el método de su controlador OnResultExecuting.

+0

Sí, lo que realmente hice es tener un punto de interrupción en mi función ActionResult y en mi filtro personalizado, el depurador solo alcanzaría el punto de interrupción en la función ActionResult. Sin embargo, – aromasca

1

Ha intentado anular el OnActionExecuting como:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
} 

Esta es mi forma de escribir filtros de acción y no he tenido un problema con ellos que se llama.

+0

Ha intentado anular la ejecución de la acción. . todavía no se llamaba ¿Podría haber alguna otra configuración requerida como en un web.config o algo así? – aromasca

+0

@aromasca - No se requiere entrada de web.config. ¿Estás seguro de que se está convocando tu acción? ¿Ha establecido un punto de interrupción en su filtro para ver si se golpea? – amurra

1

Tu código generalmente se ve bien para mí. Podría estar relacionado con lo que está haciendo (o no haciendo) en su método de Acción. Si no devuelve una vista, etc., es posible que no se llame al controlador de eventos "ResultExecuting". Me gustaría tomar la muestra here y ver qué se registra para su acción.

23

Probablemente una sugerencia tonta, pero ¿la agregó a su global.asax?
Este es un ejemplo de una de mis aplicaciones:

public class MvcApplication : System.Web.HttpApplication  
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
    filters.Add(new LogonAuthorize()); 
    filters.Add(new HandleErrorAttribute()); 
    } 
} 
+1

Después de dos horas de querer golpear mi computadora ... esto es todo lo que fue ... – Kyle

16

Mi error fue que hice referencia System.Web.Http.Filters, no System.Web.Mvc

+4

Muchas gracias Yara. También cometí el mismo error y aprendí de tu comentario. Por lo tanto, un voto para ti. :-) –

+1

Parece ser la primera modificación de referencia va por – Hoody

+1

mismo problema aquí! gracias por el consejo. Fue un error de Resharper – Korayem

0

Si ve la herencia de la clase que hereda 'ActionFilterAttribute' "FilterAttribute, IActionFilter, IResultFilter" clases. El método que está buscando está disponible en la interfaz IResultFilter.

Por lo tanto, nunca ejecuta un método cuando usamos clase personalizada como atributo. Siempre tenemos que anular todos los métodos IActionFilter y IResultFilter en términos de implementación personalizada.

Cuestiones relacionadas