Почему не работает ни один из моих ActionFilters? - PullRequest
8 голосов
/ 01 июня 2009

Я задал вопрос ранее сегодня о ActionFilters в ASP.Net MVC. Оказалось, что моя проблема была в том, что мой ActionFilter даже не работает. Среди прочего я прочитал эту статью , и я не могу найти ничего, что он делает, а я нет.

Это мой код:

// 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();
}

Точка останова в методе фильтра никогда не достигается при отладке, а TempData["filter"] содержит значение null при отображении представления.

Почему это не работает?

Ответы [ 3 ]

8 голосов
/ 30 марта 2015

В случае, если это полезно для любого, кто использует MVC 4/5:

ActionFilters не запускаются, если вы неправильно указали * ActionFilterAttribute или IActionFilter:

Используйте System.Web.Http.Filters для веб-API, System.Web.Mvc для стандартных действий MVC.

Как и в вопросе, атрибут фильтра будет просто игнорироваться (без ошибок), если вы ошибетесь, что затрудняет диагностику.

4 голосов
/ 01 июня 2009

На основании ваших комментариев к другому ответу

При тестировании с помощью модульных тестов фильтр не вызывается. Если вы хотите вызвать фильтр, то вам нужно подражать ControllerActionInvoker. Вероятно, лучше проверить сам фильтр изолированно, а затем использовать отражение, чтобы убедиться, что фильтр применяется к вашему действию с правильными атрибутами. Я предпочитаю этот механизм тестированию фильтра и действия в комбинации.

Оригинал

Конечно, вам нужен override для вашего метода, иначе вы на самом деле не заменяете метод в базовом классе. Я бы ожидал, что компилятор пожалуется, что вам нужен new или override. Если вы не включите ключевое слово override, оно будет вести себя так, как если бы вы использовали new. Поскольку среда вызывает его как ActionFilterAttribute, это означает, что ваш метод никогда не будет вызван.

Цитата из MSDN :

Если метод в производном классе не предшествует новый или переопределить ключевые слова, компилятор выдаст предупреждение и метод будет вести себя как если новое ключевое слово присутствовало.

0 голосов
/ 01 июня 2009

В дополнение к тому, что сказал tvanofosson, ваш метод действия на самом деле ничего не отображает для представления. Есть ли у вас точка зрения <%=TempData["Filter"].ToString()%> или что-то подобное?

...