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
の前に実行されることであり、最初に実行するにはこれが必要です。注文が役に立たないのですが、どうすればよいですか?
これはロングショットですが、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
@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
の順序で実行されます
Global.asax.csファイルで注文が機能していません。要件が注文の場合は、コントローラーまたはアクションメソッドに移動して指定します。例:-
[secondAttribute(order = 1)] [firstAttribute(order = 2)]
HomeController:Controller
または
public ActionResult Index()