Можете ли вы применить ActionFilter в ASP.NET-MVC для КАЖДОГО действия - PullRequest
6 голосов
/ 16 марта 2009

Я хочу применить ActionFilter в ASP.NET MVC для КАЖДОГО действия в моем приложении - на каждом контроллере.

Есть ли способ сделать это, не применяя его к каждому методу ActionResult?

Ответы [ 3 ]

9 голосов
/ 16 марта 2009

Да, вы можете сделать это, но это не так, как это работает из коробки. Я сделал следующее:

  1. Создайте базовый класс контроллеров и наследуйте от него все ваши контроллеры
  2. Создание атрибута фильтра действий и его наследование от FilterAttribute и IActionFilter
  3. Украсьте свой базовый класс контроллера новым атрибутом фильтра действий

Вот пример атрибута фильтра действий:

public class SetCultureAttribute : FilterAttribute, IActionFilter 
{ 
    #region IActionFilter implementation

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //logic goes here
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //or logic goes here
    }

    #endregion IActionFilter implementation
}

Вот пример базового класса контроллера с этим атрибутом:

[SetCulture]
public class ControllerBase : Controller
{
    ...
}

Используя этот метод, пока ваши классы контроллеров наследуются от ControllerBase, тогда фильтр действий SetCulture всегда будет выполняться. У меня есть полный пример и сообщение об этом в моем блоге , если вы хотите немного подробнее.

Надеюсь, это поможет!

5 голосов
/ 29 апреля 2011

Как все становится лучше ... 2 года спустя у нас

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorElmahAttribute());
    }
0 голосов
/ 16 марта 2009

Вам не нужно применять его к каждому действию, вы можете просто применить его к каждому контроллеру (т.е. поместить атрибут в класс, а не в метод).

Или, как упомянул Ян, вы можете поместить его в базовый класс контроллеров, а затем расширять его от этого контроллера.

...