我已经为打开和关闭NHibernate会话的所有控制器操作设置了一个全局筛选器。其中95%的操作需要一些数据库访问,但5%不需要。有什么简单的方法可以禁用这5%的全局过滤器吗?我可以反过来,只修饰需要数据库的操作,但这将是更多的工作。
发布于 2012-04-01 16:50:44
您可以编写一个标记属性:
public class SkipMyGlobalActionFilterAttribute : Attribute
{
}
然后在全局操作筛选器测试中,检查操作上是否存在此标记:
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
}
}
然后,如果您想从全局过滤器中排除某些操作,只需使用标记属性对其进行修饰:
[SkipMyGlobalActionFilter]
public ActionResult Index()
{
return View();
}
发布于 2018-05-16 17:10:29
虽然,Darin Dimitrov的公认答案很好,而且效果很好,但对我来说,最简单、最有效的答案是here。
你只需要在你的属性中添加一个布尔属性,并在你的逻辑开始之前对其进行检查:
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%行动中,就像这样使用它:
[DataAccessAttribute(Disable=true)]
public ActionResult Index()
{
return View();
}
发布于 2018-11-22 21:30:59
在AspNetCore中,@darin-dimitrov接受的答案可以修改为如下工作方式:
首先,在标记属性上实现IFilterMetadata
:
public class SkipMyGlobalActionFilterAttribute : Attribute, IFilterMetadata
{
}
然后在ActionExecutingContext
上搜索此属性的Filters
属性
public class MyGlobalActionFilter : IActionFilter
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Filters.OfType<SkipMyGlobalActionFilterAttribute>().Any())
{
return;
}
// etc
}
}
https://stackoverflow.com/questions/9953760
复制相似问题