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

时间:2018-09-26 10:29:39

标签: c# .net-core asp.net-core-mvc

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

现在,我正在使用Dotnet Core 2.1,事情有些不同,所以我无法使用相同的方法来工作。 我有一个用于继承ControllerBase的API的控制器,然后是另一个用于服务页面的控制器,该控制器继承了Controller。 我创建了从ActionFilterAttribute派生的动作过滤器类。

然后我使用此行注册动作过滤器:

services.AddMvc(config => { config.Filters.Add(typeof(MyActionFilter)); })

问题在于该过滤器现在适用于API控制器以及页面控制器。有没有办法将动作过滤器仅应用于特定的控制器?

我以this page作为初始动作过滤器实现的参考。

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

谢谢。

2 个答案:

答案 0 :(得分:2)

services.AddMvc(config => { config.Filters.Add(typeof(MyActionFilter)); })

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

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

示例:

[MyActionFilter]
public class HomeController : Controller {
   public ViewResult Index(){..}
}  

答案 1 :(得分:1)

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