我有一个具有以下签名的动作筛选器
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute根据MSDN:
-- AllowMultiple属性指示属性的多个实例是否可以存在于元素上。如果设置为true,则允许多个实例;如果设置为false (默认值),则只允许一个实例。
在MVC中,这种行为似乎有点奇怪。当我用这个属性修饰一个操作时,我发现过滤器的OnActionExecuting方法被执行了两次。
过滤器只在操作上声明,而不是在控制器上声明,我已经清除了所有全局过滤器。有人能解释一下这种行为吗?
发布于 2011-12-09 07:56:47
我也遇到了同样的问题。(我安装了一个全局过滤器(仅一次),发现它的IActionFilter和IResultFilter方法对每个请求调用了两次。传递给这些方法的filterContext.HttpContext对象对于两个调用都完全相同。)
这是由于在视图中使用了Html.Action。(从调用堆栈的角度来看),调用Html.Action似乎重新处理了子操作方法(在初始操作方法的处理过程中),并为这两个方法调用了过滤器。
您可以通过检查filterContext.IsChildAction属性来检测这种情况。
发布于 2012-07-01 17:38:00
我也让来自自定义操作过滤器类的OnActionExecuting方法执行了两次。
在某种程度上,我将其添加到global.asax.cs文件中的global.asax.cs方法中:
GlobalConfiguration.Configuration.Filters.Add(new MyCustomActionFilter());显然,我的动作过滤器已经添加到Filters集合中,这将导致对OnActionExecuting和OnActionExecuted的双重调用。因此,不需要applicaton_start中的这一行。
https://stackoverflow.com/questions/6732149
复制相似问题