Обычай ASP.NET MVC ActionFilterAttribute-хуки никогда не вызываются


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

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

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

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

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

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

Есть идеи по этому поводу? или как это реализовать по-другому?

7 14

7 ответов:

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

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

Моя ошибка заключалась в том, что я ссылался на систему.Сеть.Http.Фильтры, а не система.Сеть.Mvc

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

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

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

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

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

Идеи:

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

Различная Реализация:

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

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

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