首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.Net MVC中有选择地禁用全局过滤器

如何在ASP.Net MVC中有选择地禁用全局过滤器
EN

Stack Overflow用户
提问于 2012-03-31 14:53:17
回答 6查看 33.5K关注 0票数 79

我已经为打开和关闭NHibernate会话的所有控制器操作设置了一个全局筛选器。其中95%的操作需要一些数据库访问,但5%不需要。有什么简单的方法可以禁用这5%的全局过滤器吗?我可以反过来,只修饰需要数据库的操作,但这将是更多的工作。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-01 16:50:44

您可以编写一个标记属性:

代码语言:javascript
复制
public class SkipMyGlobalActionFilterAttribute : Attribute
{
}

然后在全局操作筛选器测试中,检查操作上是否存在此标记:

代码语言:javascript
复制
public class MyGlobalActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(SkipMyGlobalActionFilterAttribute), false).Any())
        {
            return;
        }

        // here do whatever you were intending to do
    }
}

然后,如果您想从全局过滤器中排除某些操作,只需使用标记属性对其进行修饰:

代码语言:javascript
复制
[SkipMyGlobalActionFilter]
public ActionResult Index()
{
    return View();
}
票数 156
EN

Stack Overflow用户

发布于 2018-05-16 17:10:29

虽然,Darin Dimitrov的公认答案很好,而且效果很好,但对我来说,最简单、最有效的答案是here

你只需要在你的属性中添加一个布尔属性,并在你的逻辑开始之前对其进行检查:

代码语言:javascript
复制
public class DataAccessAttribute: ActionFilterAttribute
{
    public bool Disable { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Disable) return;

        // Your original logic for your 95% actions goes here.
    }
}

然后,在你的5%行动中,就像这样使用它:

代码语言:javascript
复制
[DataAccessAttribute(Disable=true)]
public ActionResult Index()
{            
    return View();
}
票数 15
EN

Stack Overflow用户

发布于 2018-11-22 21:30:59

在AspNetCore中,@darin-dimitrov接受的答案可以修改为如下工作方式:

首先,在标记属性上实现IFilterMetadata

代码语言:javascript
复制
public class SkipMyGlobalActionFilterAttribute : Attribute, IFilterMetadata
{
}

然后在ActionExecutingContext上搜索此属性的Filters属性

代码语言:javascript
复制
public class MyGlobalActionFilter : IActionFilter
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.Filters.OfType<SkipMyGlobalActionFilterAttribute>().Any())
        {
            return;
        }

        // etc
    }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9953760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档