【问题标题】:Dotnet Core MVC - Apply action filter to specific controllers onlyDotnet Core MVC - 仅将操作过滤器应用于特定控制器
【发布时间】:2018-09-26 10:29:39
【问题描述】:

我曾在 .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() 将其与我的各个控制器的类型进行比较,但我宁愿避免这种情况,而是指定哪些控制器应该使用哪些操作过滤器。

提前致谢。

【问题讨论】:

  • 使用属性来标记你想要应用过滤器的控制器。它在您在问题中提供的文档页面上进行了描述
  • @maxs87 我试过了,例如。 [ServiceFilter(typeof(MyActionFilter))] 但它抱怨过滤器未注册 - 我也跳过了这个:config.Filters.Add(typeof(MyActionFilter))

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


【解决方案1】:
services.AddMvc(config => { config.Filters.Add(typeof(MyActionFilter)); })

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

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

例子:

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

【讨论】:

  • 谢谢,这个解决了我的问题。事实证明,你也可以使用这个[ServiceFilter(typeof(MyActionFilter))]我不确定有什么区别,但我会坚持已知并使用你的建议。
  • 见这里:docs.microsoft.com/en-us/aspnet/core/mvc/controllers/… - ServiceFilterAttribute
【解决方案2】:
  1. 首先在您的 startup.cs 中注册您的过滤器
    services.AddScoped<"---FilterNameHere----">();
    
  2. 将过滤器放入控制器中,例如
    [ServiceFilter(typeof("----FilterNameHere---"))]
     public class HomeController : ControllerBase
    
    {
        public IActionResult Index()
         {//do your code here}
    }
    

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2010-11-29
    • 2010-10-18
    • 2010-11-23
    相关资源
    最近更新 更多