你能在每个动作上在ASP.NET-MVC中应用ActionFilter吗?

时间:2009-03-16 06:14:38

标签: asp.net-mvc actionresult

我想在ASP.NET MVC中将ActionFilter应用到我的应用程序中的每个操作 - 在每个控制器上。

有没有办法在不将其应用于每个ActionResult方法的情况下执行此操作?

3 个答案:

答案 0 :(得分:9)

是的,你可以这样做,但它不是开箱即用的方式。我做了以下事情:

  1. 创建一个基本控制器类,让所有控制器继承它
  2. 创建一个动作过滤器属性,并使其继承自FilterAttribute和IActionFilter
  3. 使用新的操作过滤器属性
  4. 装饰您的基本控制器类

    以下是动作过滤器属性的示例:

    public class SetCultureAttribute : FilterAttribute, IActionFilter 
    { 
        #region IActionFilter implementation
    
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //logic goes here
        }
    
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //or logic goes here
        }
    
        #endregion IActionFilter implementation
    }
    

    以下是具有此属性的基本控制器类的示例:

    [SetCulture]
    public class ControllerBase : Controller
    {
        ...
    }
    

    只要控制器类继承自ControllerBase,就使用此方法,然后始终执行SetCulture操作过滤器。如果您想了解更多细节,我会在此on my blog上提供完整的样本和帖子。

    希望有所帮助!

答案 1 :(得分:4)

事情如何变得更好...... 2年后我们有了

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorElmahAttribute());
    }

答案 2 :(得分:0)

您不必将其应用于每个操作,您只需将其应用于每个控制器(即将属性放在类上,而不是方法上)。

或者,正如Ian所提到的,您可以将它放在基本控制器类上,然后从该控制器扩展。