猿问

如何有选择地禁用ASP.Net MVC中的全局筛选器

我为我打开和关闭NHibernate会话的所有控制器动作设置了全局过滤器。这些操作中有95%需要某些数据库访问权限,但5%则不需要。是否有任何简单的方法可以针对这5%禁用此全局过滤器。我可以反过来,只装饰需要数据库的操作,但这将需要更多工作。



繁花不似锦
浏览 422回答 3
3回答

慕桂英3389331

您可以编写一个标记属性: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    }}然后,如果要从全局过滤器中排除某些操作,只需用marker属性装饰它即可:[SkipMyGlobalActionFilter]public ActionResult Index(){    return View();}

肥皂起泡泡

虽然,达林·迪米特洛夫(Darin Dimitrov)接受的答案很好,而且效果很好,但是对我来说,这里建立的最简单,最有效的答案。您只需要在逻辑开始之前向属性添加一个布尔属性并对其进行检查: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();}
随时随地看视频慕课网APP
我要回答