我有一个带有以下签名的动作过滤器
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute
根据MSDN:
AllowMultiple属性指示是否有多个实例 您的属性可以存在于元素上。如果设置为true,则为多个 允许实例;如果设置为false(默认值),则只有一个 允许实例。
在MVC中,行为似乎有点奇怪。当我使用此属性修饰操作时,我发现过滤器的OnActionExecuting
方法已执行两次。
过滤器仅在操作上声明,而不是在控制器上声明,并且我已清除任何全局过滤器。有人可以解释这种行为吗?
答案 0 :(得分:30)
我遇到了同样的问题。 (我安装了一个全局过滤器(只有一次)并发现每个请求都调用了两次IActionFilter
和IResultFilter
方法。传递给这些方法的filterContext.HttpContext
对象完全相同两个电话。)
原来是由于在视图中使用了Html.Action
。看起来(通过查看调用堆栈)调用Html.Action
重新处理子操作方法(在初始操作方法的处理期间),并且为两者调用过滤器。
您可以通过查看filterContext.IsChildAction
属性来检测这种情况。
答案 1 :(得分:0)
我的自定义操作过滤器类中的OnActionExecuting
方法也执行了两次。
在某些时候,我将此添加到global.asax.cs文件中的Application_Start
方法中:
GlobalConfiguration.Configuration.Filters.Add(new MyCustomActionFilter());
显然,我的操作过滤器已添加到Filters
集合中,这导致对OnActionExecuting
和OnActionExecuted
的双重调用。因此,不需要在applicaton_start中使用该行。