2011-07-03 26 views
40

執行在MVC中,我們可以裝飾操作方法與不同的過濾器一樣按照什麼順序過濾器在asp.net mvc的

[HttpPost] 
[Authorize] 
public ActionResult mymethod(){} 

HttpPostMethodSelectorAttribute(可能是間接的)派生和Authorize屬性從ActionFilterAttribute繼承。

我的問題是:他們在MVC請求管道中執行的順序是什麼?我試圖在MVC源代碼中搜索,但未能找到相關的代碼位。

+0

我會假設它們在反射期間返回的順序,這可能會受到源中實際順序的影響。 –

+0

@Hasan bhai首先很高興看到你然後我相信HttpPost是actionmethodSelector(它的方法isValidForRequest被調用)屬性和Authorize是actionFilter屬性(它的onActionExecuting或onActionExecuted被調用),所以他們必須在不同的時間被調用。可能HttpPost應該在Authorize之前調用,因爲它們是不同的過濾器並具有不同的職責。 –

+0

看來我的假設是錯誤的。 Eranga的答案顯示過濾器有一個機制來指定它們的順序。然而,因爲HttpPost並不是過濾器。它可能有特殊的處理方式,可能是在執行任何其他事情之前執這又是一個假設。 –

回答

60

過濾器按以下順序執行:

  1. 授權濾波器
  2. 行動濾波器
  3. 響應濾波器
  4. 例外濾波器

例如,授權過濾器首先運行和異常過濾器最後跑步。在每個過濾器類型中,Order值指定運行順序。在每個過濾器類型和順序中,範圍枚舉值指定過濾器的順序。該枚舉定義瞭如下濾波器的範圍值(按順序在它們運行):從MSDN提取

  1. 首先
  2. 全球
  3. 控制器
  4. 行動
  5. 最後

+1

HttpPost不是上述過濾器中的任何一個,它是MehodSelectorAttribute –

+2

是的,如果有多個候選者,它用於選擇操作方法。所以它是一個標記屬性。它在過濾器執行前使用 – Eranga

+1

請訪問http://zahidadeel.blogspot.com/2011/07/ajaxonly-attribute-actionfilter-vs.html以獲取更多詳細信息 –

19

要保存你一些時間,你這是怎麼設置的順序:

[MyCustomContextFilter(Order=1)] 

該指數是基於0,所以你可以做0,1,2,等等

應當指出的是,剛因爲基類中的過濾器不告訴MVC首先應用它:(。

+2

還沒有指定順序的過濾器在順序過濾器之前運行。這適用於過濾器類型的上下文(授權,操作等)。 –

+0

注意。異常過濾器以相反的順序運行! (對真的 :/ ) – Haohmaru