6

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

有没有办法在不将其应用于每个 ActionResult 方法的情况下做到这一点?

4

3 回答 3

10

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

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

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

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 操作过滤器。如果您想要更多详细信息,我有一个完整的示例并将其发布在我的博客上。

希望有帮助!

于 2009-03-16T06:53:55.397 回答
5

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

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorElmahAttribute());
    }
于 2011-04-29T17:28:56.350 回答
0

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

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

于 2009-03-16T07:40:55.660 回答