我们可以在第三方控制器上使用过滤器覆盖功能吗?

时间:2014-07-09 05:47:21

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

我已经开发了一个ActionFilterAttribute,通过将其添加到GlobalFilterCollection全局应用。现在我想从此过滤器中排除一个特定的控制器。如果它是我自己的控制器,我可以使用ASP.NET MVC 5中的新过滤器覆盖功能(IOverrideFilter)。但是这个特定的控制器在我引用的第三方程序集中(Elmah.MVC是特定的)。有没有办法做到这一点?

现在我正在检查filterContext.RouteData.Values["controller"]方法中的ActionFilterAttribute.OnActionExecuting值,如果找到第三方控制器,请提前退出。但是如果可能的话,我希望没有那些代码。

1 个答案:

答案 0 :(得分:0)

我没有尝试过这个解决方案,但认为应该有效 -

提供 IFilterProvider 的自定义实现,并在GetFilters中仅获取要应用于控制器的那些过滤器。在这里,您可以进行任何自定义检查,例如控制器是从应用程序特定的基本控制器继承还是控制器来自当前应用程序组件

   public virtual IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)

        {
            // Add check if controller is inheriteted from your application specific   base controller     
            //OR     
            // Controller is from your Application Assembly    
           //OR
           //You can add some custom logic to select list of controllers to skip here
            if (controllerContext.Controller != null)
            {
                foreach (FilterAttribute attr in GetControllerAttributes(controllerContext, actionDescriptor))
                {
                    yield return new Filter(attr, FilterScope.Controller, order: null);
                }
                foreach (FilterAttribute attr in GetActionAttributes(controllerContext, actionDescriptor))
                {
                    yield return new Filter(attr, FilterScope.Action, order: null);
                }
            }             
        }