web-dev-qa-db-ja.com

アクションフィルターの実行順序

AuthorizeAttributeを実装する2つのクラスを作成しました。

1つはグローバルに使用され、Global.asax.csに設定します。

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

もう1つはSecondAuthorizeAttributeと呼ばれ、一部のアクションメソッドでのみ使用され、必要なメソッドの属性として使用します。

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

問題は、SecondAuthorizeAttributeが常にFirstAuthorizeAttributeの前に実行されることであり、最初に実行するにはこれが必要です。注文が役に立たないのですが、どうすればよいですか?

19
vtortola

これはロングショットですが、FirstAuthorizeAttributeにGlobal値とFirst値を使用してみましたか?

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

12
Hector Correa

@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の順序で実行されます

20
freedomn-m

Global.asax.csファイルで注文が機能していません。要件が注文の場合は、コントローラーまたはアクションメソッドに移動して指定します。例:-

[secondAttribute(order = 1)] [firstAttribute(order = 2)]

HomeController:Controller

または

public ActionResult Index()

3
sahil