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

Ben*_*ter 13 asp.net-mvc asp.net-mvc-3

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

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

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

在MVC中,行为似乎有点奇怪.当我用这个属性修饰一个动作时,我发现OnActionExecuting过滤器的方法被执行了两次.

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

Bra*_*ger 32

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

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

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

  • filterContext.IsChildAction 挽救了很多生命。谢谢。 (2认同)