Как установить фильтр действий во все действия в ASP.NET MVC?

Есть ли способ иметь фильтр действий, например

public class MyActionFilterAttribute : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext context) {
    ...

автоматически применяться ко всем действиям на веб-сайте?


person pupeno    schedule 24.08.2009    source источник


Ответы (5)


Я не верю, что есть готовый способ сделать это. Для простых сайтов проще всего применить фильтр на уровне контроллера. Это довольно распространено, и, как правило, неплохо иметь свой собственный базовый класс контроллера на случай, если подобные вещи возникнут там, где вы хотите распространить его на все ваши контроллеры. Например.:

[MyActionFilter]
public class MyBaseController : Controller
{
  ...
}

public class HomeController : MyBaseController
{
  ...
}

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

person womp    schedule 24.08.2009

Я знаю, что это старый вопрос, но, начиная с ASP.NET MVC 3, вы можете использовать глобальные фильтры.

person Victor Grigoriu    schedule 14.05.2013

  1. Вы можете применить его ко всему классу контроллера, чтобы он влиял на все действия на контроллере.
  2. Вы можете применить его к базовому классу контроллера и наследовать все ваши контроллеры от этого контроллера, таким образом получая эффект применения фильтра ко всем контроллерам.
  3. Вы можете использовать базовый класс контроллера и переопределить метод OnActionExecuting непосредственно в контроллере, что, вероятно, более уместно, чем использование фильтра, если вы намерены применить код фильтра ко всем действиям по всем направлениям.
person Nathan Ridley    schedule 24.08.2009
comment
Под двумя вы подразумеваете применение его к классу контроллера, предоставляемому ASP.NET MVC? Это возможно? Как? - person pupeno; 24.08.2009
comment
Нет, он имеет в виду, что все ваши контроллеры должны наследоваться от базового класса контроллера, который вы бы написали, который расширил контроллер asp.net mvc. В вашем базовом классе контроллера вы должны пометить его фильтром. - person womp; 24.08.2009

Вы можете просто использовать ActionFilters, как указал Виктор, в вашем global.asax

protected void Application_Start()
{
   // Register global filter
   GlobalFilters.Filters.Add(new CustomActionFilterAttribute());
}

Или в AspNetCore вы можете попробовать

  services.AddMvc(options =>
  {
    options.Filters.Add(new CustomActionFilterAttribute());
  });
person jwize    schedule 02.05.2018

Где NewlyCreatedActionFilter — это ActionFilter, который вы создаете, очевидно. :)

[NewlyCreatedActionFilter]
public class Basecontroller : Controller
{
  ...
}

public class HomeController : BaseController
{
  ...
}

public class AccountController : BaseController
{
  ...
}

Оба этих класса контроллеров наследуются от BaseController, поэтому ко всем применяется фильтр NewlyCreatedActionFilter.

person Dan Atkinson    schedule 24.08.2009