17

我創建了兩個類來實現AuthorizeAttribute動作篩選器執行順序

一個是全球使用,我就定它的Global.asax.cs中:

filters.Add(new FirstAuthorizeAttribute() { Order = 0 }); 

另一種方式叫做SecondAuthorizeAttribute,它是在一些操作方法只用,我用它作爲屬性我想要的方法。

[HttpGet] 
    [SecondAuthorize] 
    public ActionResult LogOut() 
    { 
     FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Session.Abandon(); 
     return Redirect(Url.Content("~/")); 
    } 

的問題是,SecondAuthorizeAttribute總是FirstAuthorizeAttribute之前執行,我需要這個先執行。該命令沒有幫助,我怎麼能做到這一點?

回答

3

順序沒有的Global.asax.cs文件的工作。 如果需求是訂單,然後轉到控制器或操作方法,並給。 例如: -

[secondAttribute(順序= 1)] [firstAttribute(順序= 2)]

HomeController中:控制器

公共的ActionResult指數()

15

@ HectorCorrea的答案中的鏈接目前已經死亡,下面是從當前Google緩存中檢索並總結的內容(如果情況也是如此):

過濾器執行順序是:

  • 授權過濾
  • 行動過濾器
  • 響應/結果過濾器
  • 異常過濾器

在每一個過濾器,你可以指定Order屬性。 (所有過濾器派生自抽象類FilterAttribute,並且此類具有Order屬性)。該屬性將確保過濾器以特定順序運行。

如:

[AuthorizationFilterA(Order=2)] 
[AuthorizationFilterB(Order=1)] 
public ActionResult Index() 
{   
    return View(); 
} 

還有FilterScope,默認情況下,用最低的範圍過濾器第一次運行時的順序是一樣的(或不指定):

namespace System.Web.Mvc { 
    public enum FilterScope { 
     First = 0, 
     Global = 10, 
     Controller = 20, 
     Action = 30, 
     Last = 100, 
    } 
} 

如果沒有訂單被指定,訂單值爲-1(首先,不是最後)。

控制器本身可以是過濾器,將與順序運行Int32.MinValue

+2

請記住,異常過濾器以相反的順序運行(當然它們是這樣做的!),因此對於那些過濾器的最高範圍運行 – levelnis