2015-08-17 38 views
6

根據該documentation for ASP.NET Filters濾波器運行下面的命令:什麼是過濾器範圍以及爲什麼奇怪的名稱?

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

的每個過濾器類型內有一個過濾器訂單指定運行順序。

目前有意義......但後來它變得奇怪。

有每個濾波器類型和順序其被表示爲下列值的枚舉中的排序的的另一方法:

public enum FilterScope 
{ 
    First = 0, 
    Global = 10, 
    Controller = 20, 
    Action = 30, 
    Last = 100, 
} 

不全球,控制器和動作具有運行順序內什麼軸承對於動作過濾器?

例如:

如果我有兩個操作過濾器,二者以1:1的運行順序和分別控制器和行動FilterScope

除了在另一個前面訂購一個,ControllerAction對什麼有影響?

此外Bizarreness

According to thisFilterScope提供了一種用於過濾器的第三級排序。 ControllerGlobalAction是如何訂購一個過濾器,該過濾器僅限於在ControllerAction上使用,並且不一定全面應用?它不是描述訂單。

此外,如果它確實提供第三級過濾,爲什麼只限於5個選項?

+0

我覺得'FilterScope'定義了你在哪裏使用過濾器:全局,整個控制器上還是某個動作。因此,第一個將執行的將是一個全局過濾器,然後控制器,然後動作 –

+0

這是否幫助你:https://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v= vs.118).aspx? – Marco

+0

@VsevolodGoloviznin我認爲是相同的,但這並不能解釋爲什麼它爲每個「過濾器類型和順序」指定,它肯定會是這些的總體。所以它會是:過濾器範圍,過濾器類型,過濾器順序。不是相反嗎? – Luke

回答

3

Filter對象,實際上有一個Scope屬性的對象,根據使用構造 - 當你添加一個過濾器,全球應用過濾器,Filter對象使用GlobalScope構建。同樣,從控制器和動作收集過濾器屬性時,分別使用ControllerAction的作用域構建對象。

我不完全知道如何與First一個ScopeLast實際上是一個Filter被創建。

指定這些規則說明如何應用打破平局,例如,如果在全局級別和動作級別使用相同的Order值聲明過濾器 - 這是比聲明的過濾器更關注的問題在您需要手動確保每個過濾器使用獨特的Order(如果您關心訂購)的同一級別。

+1

我認爲默認值是'First',因爲它是'enum'中的第一個,這導致它等於'0' – VMAtm

2

嗯,我真的不明白你在這裏發現了什麼奇怪的東西。

授權,動作,響應和異常過濾器是可以實現,運行過濾器邏輯,分別IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter接口4級的接口。

之後,業務規則出現在燈光下。例如,您必須檢查某些用戶操作的訪問權限。您不僅實現了授權過濾器,還創建了檢查規則的邏輯,如:

  • 如果用戶未完成註冊,則必須提醒他有關此事的信息。無論用戶在您的網站上做什麼,此規則應在First運行。
  • 如果用戶未被批准,他將無法查看網站內容,並且應該獲得驗證消息。所以這是一個Global作用域規則,並且應在任何其他用戶權限檢查之前運行。
  • 如果用戶無法訪問某個部門,他無法在網站上查看關於該部門的某些內容,但不是全部 - 因此我們讓Controller選擇,應向用戶顯示哪些內容。
  • 如果用戶不是經理,他不能編輯或刪除一些內容。所以,這是一個正在被過濾的具體Action
  • 任務處理完畢後,我們可以啓動一些記錄器,所以我們必須等到工作完成,然後運行過濾器Last

我在這裏看到了過濾器訂購一個非常簡單的模型,我可以爲每對或filter type/filter scope樣本。

更新:

some sample code for a Filter's ordering

public class ControllerInstanceFilterProvider : IFilterProvider { 
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { 
     if (controllerContext.Controller != null) { 
      // Use FilterScope.First and Order of Int32.MinValue to ensure controller instance methods always run first 
      yield return new Filter(controllerContext.Controller, FilterScope.First, Int32.MinValue); 
     } 
    } 
} 
+0

感謝您的回答。根據文檔,過濾範圍是第三級排序,而不是設置應用的位置 – Luke

+1

我找不到FilterScope的一個示例,您可以嗎? – Luke

+0

@Coulton是的,我已經說過,這只是關於「排序」,應該用於複雜的過濾器層次結構。 – VMAtm