asp.net mvc动作的奇怪行为过滤了AttributeUsage

时间:2011-07-18 11:23:50

标签: asp.net-mvc asp.net-mvc-3

我有一个带有以下签名的动作过滤器

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute

根据MSDN:

  

AllowMultiple属性指示是否有多个实例   您的属性可以存在于元素上。如果设置为true,则为多个   允许实例;如果设置为false(默认值),则只有一个   允许实例。

在MVC中,行为似乎有点奇怪。当我使用此属性修饰操作时,我发现过滤器的OnActionExecuting方法已执行两次。

过滤器仅在操作上声明,而不是在控制器上声明,并且我已清除任何全局过滤器。有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:30)

我遇到了同样的问题。 (我安装了一个全局过滤器(只有一次)并发现每个请求都调用了两次IActionFilterIResultFilter方法。传递给这些方法的filterContext.HttpContext对象完全相同两个电话。)

原来是由于在视图中使用了Html.Action。看起来(通过查看调用堆栈)调用Html.Action重新处理子操作方法(在初始操作方法的处理期间),并且为两者调用过滤器。

您可以通过查看filterContext.IsChildAction属性来检测这种情况。

答案 1 :(得分:0)

我的自定义操作过滤器类中的OnActionExecuting方法也执行了两次。

在某些时候,我将此添加到global.asax.cs文件中的Application_Start方法中:

GlobalConfiguration.Configuration.Filters.Add(new MyCustomActionFilter());

显然,我的操作过滤器已添加到Filters集合中,这导致对OnActionExecutingOnActionExecuted的双重调用。因此,不需要在applicaton_start中使用该行。