2011-05-27 42 views
11

我定義了兩個ActionFilters:訂購ActionFilter的屬性,從最低到最高,反之亦然?

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

讓我吃驚DefaultResources之前RenderTemplate執行。但根據MSDN文檔它應該工作反之亦然: 過濾器3,過濾器1,然後過濾器2:

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

在這個例子中,動作過濾器將 按以下順序執行。

我使用.NET 4.並通過OnActionExecuted方法進行比較。我錯過了什麼嗎?謝謝。

回答

22

Last-in First-out order

這是我一直在尋找的答案。 OnActionExecuted的順序是OnActionExecuting的顛倒順序...

+0

爲什麼它是Filter1,Filter2,Filter3(如你的響應圖所示)而不是Filter3,Filter1,Filter2(根據你的問題的「order =」屬性參數的明顯意圖? – Mishax 2015-12-02 12:00:43

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方法。「

+0

執行的唯一方法是在ActionFilters中的OnActionExecuted,正如我以前寫的。另一個可能的區別(但恕我直言,不太可能)導致這種情況,DefaultResource是在MVC應用程序項目中實現的,另一個是在鏈接項目中定義的。 – 2011-05-30 06:39:02

+1

對於我可以明確說的更多,訂單價值的變化使訂單不同。例如。 DefaultResource(Order = 2)RenderTemplate(Order = 3)第一次執行的是RenderTemplate,讀取msdn和gregshackles沒有意義... – 2011-05-30 06:56:20

0

請參閱Filtering in ASP.NET MVC瞭解決定操作過濾器及其方法的執行順序的完整說明。

關於OnResultExecuted,你說你的過濾器正在使用,請參閱以下內容:

OnActionExecuting(ActionExecutingContext)OnResultExecuting(ResultExecutingContext)OnAuthorization(AuthorizationContext)過濾器以正向順序運行。 OnActionExecuted(ActionExecutedContext),OnResultExecuting(ResultExecutingContext)OnException(ExceptionContext)過濾器以相反的順序運行。

排序實際上相當複雜,因此請查看文章以獲取更多詳細信息。