我只注意到MVC3中ActionFilterAttribute优先级的一个奇怪行为。事实证明,如果Controller和Action均使用AllowMultiple = false(缺省值)的相同ActionFilterAttribute进行修饰,则将选择具有较高Order值的ActionFilterAttribute。如果是平局(即两个Order值相同),则选择Action上的过滤器。我一直认为Action中的筛选器总是被选中(如果存在的话),无论Order值如何。实例:ASP.NET MVC3 ActionFilterAttribute优先级/选择 - 奇怪?
行动过滤器选择:上控制器
[MyActionFilter(Name = "Controller")] // same as Order = -1
public class HomeController : Controller {
[MyActionFilter(Name = "Action")] // same as Order = -1
public ActionResult Index() {
return Content("Hello");
}
}
过滤器选择:
[MyActionFilter(Name = "Controller", Order = 1)]
public class HomeController : Controller {
[MyActionFilter(Name = "Action")] // same as Order = -1
public ActionResult Index() {
return Content("Hello");
}
}
行动过滤器选择:
[MyActionFilter(Name = "Controller", Order = 1)]
public class HomeController : Controller {
[MyActionFilter(Name = "Action", Order = 1)]
public ActionResult Index() {
return Content("Hello");
}
}
控制器上的过滤器选择:
[MyActionFilter(Name = "Controller", Order = 20)]
public class HomeController : Controller {
[MyActionFilter(Name = "Action", Order = 1)]
public ActionResult Index() {
return Content("Hello");
}
}
这是一个错误或设计?自从版本1开始,我一直在使用MVC,并从未注意到这个过滤器选择优先级。它一直是这样吗?
感谢
感谢达林,但我看到不同的结果比你说出什么。我正在设置AllowMultiple = false。如果在控制器的属性上,我设置了Order = 1,并且在具有相同属性的操作上,我没有设置Order,那么控制器上的属性被执行。我通过在属性的OnActionExecuting覆盖中执行System.Diagnostics.Debug.WriteLine(Name)来检查它。你可以试试在Controller的属性上使用更高的Order值来运行你的例子,并确认Controller上的属性确实从未运行过?谢谢。 – 2011-03-19 16:44:55