12

我定义了两个 ActionFilter:

[DefaultResources(Order = 2)]
[RenderTemplate(Order = 1)]

令我惊讶的是,DefaultResources 在 RenderTemplate 之前执行。但根据 MSDN 文档,它应该反之亦然:

[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
    View("Index");
}

在此示例中,操作过滤器将按以下顺序执行:Filter3、Filter1,然后是 Filter2。

我正在使用.NET 4。并通过方法 OnActionExecuted 进行比较。我错过了什么吗?

4

3 回答 3

24

后进先出顺序

这是我一直在寻找的答案。OnActionExecuted 的顺序与 OnActionExecuting 的顺序相反...

于 2011-05-30T12:23:07.563 回答
1

这完全取决于每个过滤器实现的内容。

如果 DefaultResource 实现了 OnActionExecuting 或 OnActionExecuted,那么如果 RenderTemplate 没有,它将首先触发。

有关更多详细信息,请参阅:

http://www.gregshackles.com/2010/09/custom-ordering-of-action-filters-in-asp-net-mvc/

http://msdn.microsoft.com/en-us/library/dd381609.aspx

“ASP.NET MVC 框架将在调用任何标记有您的操作过滤器属性的操作方法之前调用您的操作过滤器的 OnActionExecuting 方法。同样,该框架将在操作方法完成后调用 OnActionExecuted 方法。”

于 2011-05-30T05:23:23.653 回答
0

请参阅ASP.NET MVC中的过滤以获取有关决定操作过滤器执行顺序及其方法的完整说明。

关于OnResultExecuted您所说的过滤器正在使用的 ,请参见以下内容:

、和过滤OnActionExecuting(ActionExecutingContext)器按正序运行。、和过滤器以相反的顺序运行。OnResultExecuting(ResultExecutingContext)OnAuthorization(AuthorizationContext)OnActionExecuted(ActionExecutedContext)OnResultExecuting(ResultExecutingContext)OnException(ExceptionContext)

排序实际上非常复杂,因此请查看文章了解更多详细信息。

于 2013-11-29T05:55:21.007 回答