ActionFilter 的 order 属性,从最低到最高,反之亦然?

Posted

技术标签:

【中文标题】ActionFilter 的 order 属性,从最低到最高,反之亦然?【英文标题】:Order property of ActionFilter, from lowest to greatest or vice versa? 【发布时间】:2011-09-03 09:22:30 【问题描述】:

我定义了两个 ActionFilter:

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

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

[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()

    View("Index");

在本例中,动作过滤器将 按以下顺序执行: 过滤器 3,过滤器 1,然后过滤器 2。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

为什么它是 Filter1、Filter2、Filter3(如您的响应图中所示)而不是 Filter3、Filter1、Filter2(根据您问题中“order =”属性参数的明显意图? 【参考方案2】:

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

如果 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 方法。类似地,框架将在动作方法完成后调用 OnActionExecuting 方法。 "

【讨论】:

唯一实现的方法是两个 ActionFilter 中的 OnActionExecuted,正如我之前所写的。另一个可能(但恕我直言不太可能)导致这种情况的差异是,DefaultResource 是在 MVC 应用程序项目中实现的,另一个是在链接项目中定义的。 我可以明确地说,更改 Order 值会使 order 不同。例如。 DefaultResource(Order=2) RenderTemplate(Order=3) 第一次执行的还是 RenderTemplate,读完 msdn 和 gregshackles 没有意义...【参考方案3】:

请参阅Filtering in ASP.NET MVC,了解决定操作过滤器执行顺序的因素及其方法的完整说明。

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

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

排序实际上相当复杂,请查看文章了解更多详细信息。

【讨论】:

以上是关于ActionFilter 的 order 属性,从最低到最高,反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章

如何从操作属性获取视图文本

ActionFilter 不适用于 AJAX 调用

在 .net core c# 的 ExceptionFilter 中从 ActionFilter 中捕获异常

[Asp.Net Core]ActionFilter的特点

MVC-ActionFilter

为啥将自定义 WrappedRequest 与额外的类型参数和 ActionFilter 组合会导致类型丢失?