Пользовательский ASP.NET MVC ActionFilterAttribute - перехватчики никогда не вызываются

Привет, я пытаюсь сделать что-то, что кажется простым и документированным, но по какой-то причине это не так просто.

В основном я написал что-то вроде этого:

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

Однако, когда я пытаюсь использовать это для результата действия следующим образом:

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

Моя пользовательская функция overriden никогда не вызывается...

любые идеи по этому поводу? или как реализовать это по-другому?

Ответ 1

Наконец, выяснилось, что в конце концов я поставил фильтр на функцию, которая фактически была функцией ActionResult, но она была возвращена другим методом, который вызвал ее, поэтому фильтры только выполняется один раз в точке входа Action.

Ответ 2

Возможно, глупое предложение, но вы добавили его в свой global.asax?
Это пример из одного из моих приложений:

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

Ответ 3

Моя ошибка заключалась в том, что я ссылался на System.Web.Http.Filters, а не на System.Web.Mvc

Ответ 4

Вы пытались переопределить OnActionExecuting как:

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

Именно так я пишу фильтры действий и не имел проблемы с их вызовом.

Ответ 5

Ваш код, как правило, выглядит хорошо для меня. Это может быть связано с тем, что вы делаете (или не делаете) в своем методе действий. Если вы не возвращаете представление и т.д., Возможно, ваш обработчик событий "ResultExecuting" не вызывается. Я бы взял здесь образец и посмотрел, что будет зарегистрировано для вашего действия.

Ответ 6

Идеи:

Вы уверены, что ваш фильтр не работает? Вы поставили точку останова? Ты уверен это не бросание и исключение? Вы уверены, что действие, которое вы украсили, действительно вызвано?

Различные реализации:

Отмените метод OnResultExecuting вашего контроллера.

Ответ 7

Если вы видите наследование класса 'ActionFilterAttribute', которое наследует классы "FilterAttribute, IActionFilter, IResultFilter". Метод, который вы ищете, доступен в интерфейсе IResultFilter.

Поэтому он никогда не выполняет метод, когда мы используем собственный класс как атрибут. Всегда нужно переопределить все теги IActionFilter и IResultFilter в пользовательской реализации.