代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

如何在ASP.NET MVC中的所有操作中安装操作筛选器?

  •  4
  • Pablo Fernandez  · 技术社区  · 16 年前

    有没有一种方法可以像

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

    是否自动应用于网站中的所有操作?

    5 回复  |  直到 7 年前
        1
  •  8
  •   Victor Grigoriu    12 年前

    我不相信有现成的方法可以做到这一点。对于简单的站点,最简单的事情就是在控制器级别应用过滤器。这是很常见的,一般来说,最好有自己的基本控制器类,以防类似的事情突然出现,您希望将其传播到所有控制器。例如。:

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

    也就是说, here is a blog post 演示如何实现应用程序范围的操作筛选器。看起来工作量不大,但也许您可以使用此技术。

        2
  •  6
  •   Victor Grigoriu    12 年前

    我知道这是一个老问题,但从ASP.NET MVC 3开始,您可以使用 global filters .

        3
  •  2
  •   Nathan Ridley    16 年前
    1. 您可以将其应用于整个控制器类,以使其影响控制器上的所有操作。
    2. 您可以将它应用于一个基本控制器类,并让您的所有控制器从该控制器继承,从而获得将过滤器应用于所有控制器的效果。
    3. 您可以使用一个基本控制器类,并直接在控制器上重写OnActionExecuting方法,如果您的目的是将筛选代码应用于整个板上的所有操作,那么这可能比使用筛选器更合适。
        4
  •  0
  •   Dan Atkinson    16 年前

    显然,newlyCreatedActionFilter是您正在创建的ActionFilter。:)

    [NewlyCreatedActionFilter]
    public class Basecontroller : Controller
    {
      ...
    }
    
    public class HomeController : BaseController
    {
      ...
    }
    
    public class AccountController : BaseController
    {
      ...
    }
    

    这两个控制器类都将继承自BaseController,因此新的lyCreatedActionFilter过滤器将应用于所有类。

        5
  •  0
  •   jwize    7 年前

    正如维克托所指出的,您可以在global.asax中使用actionfilters。

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

    或者在AspNetCore中,你可以尝试

      services.AddMvc(options =>
      {
        options.Filters.Add(new CustomActionFilterAttribute());
      });