17

AuthorizeAttributeを実装する2つのクラスを作成しました。アクションフィルタの実行順序

一つは、世界的に使用されている、と私は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前に実行することで、私が最初に実行するために、このいずれかが必要。注文は役に立たない、どうすればいい?

答えて

11

これは長時間ですが、FirstAuthorizeAttributeのグローバル値と最初の値を使用してみましたか?

http://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v=vs.98).aspx

http://blog.rajsoftware.com/post/2011/05/14/MVC3-Filter-Ordering.aspx

+0

おかげで実行されます

コントローラ、私はそれを今夜しようとします。 – vtortola

+3

関連するコンテンツをリンクから回答にコピーすることを検討してください。 – BartoszKP

3

注文はglobal.asax.csファイルで作業されていません。 要件が注文の場合は、コントローラまたはアクションメソッドに移動してください。 例: -

[secondAttribute(順序= 1)] [firstAttribute(オーダー= 2)]

にHomeController:コントローラ

又は

公共のActionResultインデックス()

15

@ HectorCorreaの回答のリンクは現時点では死んでいますが、現在のGoogleのキャッシュから取得して要約したコンテンツは次のとおりです:

フィルタがこの順で実行します。

  • 認証フィルタ
  • アクションフィルタ
  • 応答/結果フィルタの各フィルタ内
  • 例外フィルタ

を、あなたは注文プロパティを指定することもできます。 (すべてのフィルタは抽象クラスFilterAttributeから派生し、このクラスはOrderプロパティを持っています)。このプロパティは、フィルタが特定の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, 
    } 
} 

noの場合orderが指定されている場合、order値は-1(最初、最後ではありません)です。自身がフィルタすることができ、順番Int32.MinValue

+2

例外フィルタは逆の順序で実行されることに注意してください(もちろんそうです)。そのため、最も高いスコープを持つフィルタが最初に実行されます – levelnis