不要将ActionFilterAttribute应用于特定路线?

时间:2014-04-10 20:12:57

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

我有一个MvC .Net Web应用程序,我正在对所有路由应用动作过滤器属性。如何配置它以使此过滤器不应用于我在WebApiConfig.cs中指定的特定路由(即“/ api / ignore”)?

在我的Globax.asax.cs中,我在Application_Start()中有这两行,所以这个过滤器被调用。

ISessionFilter sessionFilter = (ISessionFilter) DependencyResolver.Current.GetService<ISessionFilter>();

GlobalFilters.Filters.Add(sessionFilter);

这是我的过滤器:

public class SessionFilter : System.Web.Mvc.ActionFilterAttribute, System.Web.Mvc.IActionFilter, ISessionFilter
{

        public SessionFilter()
        {
        }

        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {
        //logic here
        }
}

有干净的方法吗?我是否需要在我的过滤器类中硬编码要忽略的路径(我不想这样做)

1 个答案:

答案 0 :(得分:3)

在Rails中有一些叫做的东西:skip_before_filter ...不幸的是,在.NET中你需要做这样的事情(基本上做一个虚拟属性,当你做一个动作时,取决于你喜欢的某些条件,停止该动作的执行):

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class HanlleyDisable : Attribute { }

public class SessionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool disabled = filterContext.ActionDescriptor.IsDefined(typeof(HanlleyDisable ), true) ||
                        filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(HanlleyDisable), true);
        if (disabled)
            return;    

        // action filter logic here...
    }
}

class FooController  {  

    [HanlleyDisable]
    MyMethod() { ... } 

}