2009-06-01 26 views
5

I asked a question hoy aproximadamente ActionFilters en ASP.Net MVC. Resultó que mi problema era que mi ActionFilter ni siquiera se estaba ejecutando. Entre otras cosas leí this article, y no puedo encontrar nada que él haga que yo no haga.¿Por qué no se ejecuta ninguno de mis ActionFilters?

Este es mi código:

// The ActionFilter itself 
public class TestingIfItWorksAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.TempData["filter"] = "it worked!"; 
     base.OnActionExecuting(filterContext); 
    } 
} 

// The Controller Action with the filter applied 
[TestingIfItWorks] 
public ActionResult Test() 
{ 
    var didit = TempData["filter"]; 
    return View(); 
} 

Un punto de interrupción en el método de filtro no se ve afectado cuando depurar y TempData["filter"] mantiene un valor null cuando se hace la vista.

¿Por qué no funciona?

Respuesta

4

Sobre la base de sus comentarios a otra respuesta

Cuando se prueba a través de pruebas de unidad, el filtro no se invoca. Si desea invocar el filtro, deberá imitar el ControllerActionInvoker. Probablemente sea mejor probar el filtro en forma aislada, luego use la reflexión para asegurarse de que el filtro se aplique a su acción con los atributos correctos. Prefiero este mecanismo sobre probar el filtro y la acción en combinación.

original

Seguramente Hace falta un programa override de su método de lo contrario no son en realidad la sustitución del método en la clase base. Hubiera esperado que el compilador se quejara de que necesitaba new o override en él. Si no incluye la palabra clave override, se comportará como si usara new. Como el framework lo invoca como un ActionFilterAttribute, esto significa que su método nunca será llamado.

Citando MSDN:

Si el método en la clase derivada es no precedida de nuevo o anular palabras clave, el compilador emitirá un aviso y el método se comportará como si la nueva palabra clave estuvieron presentes.

+0

Hm ... extraño que no haya entrado. No recibí una advertencia (hasta que volví a compilar), pero la anulación no cambió la situación: el código aún no se ejecuta. –

+0

¿Hizo una solución de reconstrucción?Quizás una biblioteca no está actualizada. No puedo imaginar que esto no funcione si estás utilizando la anulación. – tvanfosson

+0

Lo hice. Sin suerte ... = ( –

0

Además de lo que tvanofosson dijo, su método de acción no está realmente representando nada a la vista. ¿Su vista tiene una declaración <%=TempData["Filter"].ToString()%> o algo similar?

+0

No, en realidad no tengo una vista . Tengo un punto de interrupción en el método ActionResult en el controlador, y un punto de interrupción en el método OnActionExecuting en el filtro, y un UnitTest que llama a la acción. Presiono "Prueba de depuración" y me detengo en la acción del controlador, pero no en la acción de filtro. Además, la prueba unitaria intenta afirmar que TempData ["filter"] == "funcionó!", Y falla. –

+0

Aha: el atributo no se invoca desde la prueba unitaria, solo es invocado por el marco MVC cuando el método es invocado por el ejecutor de acciones. – tvanfosson

4

En caso de que sea útil para cualquier persona que utilice MVC 4/5:

ActionFilters no se ejecutan si se obtiene el espacio de nombres de su ActionFilterAttribute o IActionFilter equivocada: https://stackoverflow.com/a/13710468/188926

Uso System.Web.Http.Filters de Web API, System.Web.Mvc para acciones MVC estándar.

Al igual que en la pregunta, el atributo de filtro simplemente se ignorará (sin error) si se equivoca, lo que hace que sea difícil de diagnosticar.

Cuestiones relacionadas