Порядок выполнения фильтра действий
Я создал два класса, которые реализуют 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
, и мне нужно, чтобы это выполнялось первым. Заказ не помогает, как я могу это сделать?
Ответы
Ответ 1
Это длинный снимок, но вы пытались использовать значения Global и First для вашего 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
Ответ 2
Ссылка в ответе @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
Ответ 3
Заказ не работает в файле global.asax.cs.
Если требование - это порядок, то перейдите к Controller или Action Method и дайте.
например: -
[secondAttribute (порядок = 1)]
[FirstAttribute (порядок = 2)]
HomeController: контроллер
или
public ActionResult Index()