Dotnet Core MVC - 仅将操作过滤器应用于特定控制器

Ano*_*aly 6 c# asp.net-core-mvc .net-core

我曾在 .Net 4 上的 MVC 中工作,并且在控制器类中覆盖了我的操作过滤器。这样我就可以拥有多个控制器,每个控制器都有一个独特的OnActionExecuting方法。

现在我正在开发 Dotnet Core 2.1,情况有些不同,所以我无法使用相同的方法。我有一个用于继承的 API 的控制器ControllerBase,然后是另一个用于服务页面的控制器,该控制器继承了Controller. 我创建了派生自ActionFilterAttribute.

然后我使用这一行注册了我的动作过滤器:

services.AddMvc(config => { config.Filters.Add(typeof(MyActionFilter)); })
Run Code Online (Sandbox Code Playgroud)

问题是过滤器现在适用于 API 控制器和页面控制器。有没有办法将操作过滤器仅应用于特定控制器?

我使用此页面作为我的初始操作过滤器实现的参考。

我知道在OnActionExecuting方法内部我可以使用context.Controller.GetType()它与我的各个控制器的类型进行比较,但我宁愿避免这种情况,而是指定哪些控制器应该使用哪些操作过滤器。

提前致谢。

小智 6

services.AddMvc(config => { config.Filters.Add(typeof(MyActionFilter)); })
Run Code Online (Sandbox Code Playgroud)

当您想要应用全局过滤器时,使用上面的源代码,这意味着每个 API 都会受到影响。

因此,对于特定的特定控制器,您只需将 [MyActionFilter] 属性添加到您的控制器即可

例子:

[MyActionFilter]
public class HomeController : Controller {
   public ViewResult Index(){..}
}  
Run Code Online (Sandbox Code Playgroud)


小智 5

  1. 首先在你的startup.cs中注册你的过滤器
    services.AddScoped<"---FilterNameHere----">();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将您的过滤器放入控制器中,例如
    [ServiceFilter(typeof("----FilterNameHere---"))]
     public class HomeController : ControllerBase
    
    {
        public IActionResult Index()
         {//do your code here}
    }
    
    Run Code Online (Sandbox Code Playgroud)