Ранее выполнение ActionFilterAttribute в базовом контроллере - MVC2 - PullRequest
1 голос
/ 03 марта 2011

У меня есть следующие настройки. Когда действие выполняется в GuestDetailsController, как я могу запустить [LoadThemeInfo] до [RequireCheckoutAvailability] без указания порядков на атрибутах дочернего контроллера? Все фильтры используют OnActionExecuting.

[LoadThemeInfo(Order=1)]
public class MgControllerBase : Controller
{

}

[RequireCheckoutAvailability(Order=2)]
public class GuestDetailsController : MgControllerBase
{

}

С msdn : Свойство Order принимает целочисленное значение, которое должно быть 0 (по умолчанию) или больше, за одним исключением. Пропуск свойства Order дает фильтру значение заказа -1, что указывает на неопределенный порядок. Любой фильтр действий в области действия, свойство Order которого установлено в -1, будет выполняться в неопределенном порядке, но перед фильтрами, имеющими указанный порядок.

Я бы предпочел, чтобы в этом случае неуказанные выполнялись после тех, которые имеют указанный порядок. Есть ли другой способ сделать то, что я пытаюсь достичь? Может быть, переместить загрузочный код информации о теме из атрибута и куда-нибудь еще?

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Установить порядок в конструкторе атрибута.Чтобы сохранить порядок выполнения в одном месте и упростить его поддержку при добавлении новых атрибутов, создайте enum, например:

 public enum CustomActionFilterOrder{
     LoadThemeInfo = 1,
     RequireCheckoutAvailability = 2,
 }

, и конструктор атрибутов будет выглядеть как

public RequireCheckoutAvailability(){
    this.Order = (int)CustomActionFilterOrder.RequireCheckoutAvailability;
}
0 голосов
/ 03 марта 2011

Снятие ActionFilterAttribute с базового контроллера и вызов его из переопределенного OnActionExecuting заставляет его выполняться раньше, чем атрибуты на дочерних контроллерах.

public class MgControllerBase : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var filter = new LoadThemeInfoFilter(DependencyLookup.Resolve<IBrandContext>());
        filter.OnActionExecuting(filterContext);

        base.OnActionExecuting(filterContext);
    }
}

[RequireCheckoutAvailability]
public class GuestDetailsController : MgControllerBase
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...