Как заставить ActionFilter на методе действия иметь приоритет над тем же ActionFilter на контроллере - PullRequest
5 голосов
/ 29 мая 2009

Поскольку asp.net mvc сильно изменился с ноября, у кого-нибудь есть решение этого вопроса:

Resolve FilterAttributes On Controller And Action

Фил сказал, что ActionFilter на контроллере - это просто сокращение для применения атрибута ко всем методам действия контроллера, и это правда, если я добавлю один и тот же атрибут ActionFilter на контроллер и метод действия, он будет запущен дважды , Но это не похоже на естественное поведение, так как компилятор даже не позволяет вам добавлять один и тот же атрибут непосредственно в метод несколько раз.

Ответы [ 2 ]

7 голосов
/ 30 мая 2009

Фильтр может иметь приоритет над другим фильтром, указав свойство Order для каждого фильтра. Например ...

[MyFilter(Order=2)]
public class MyController : Controller
{
    [MyFilter(Order=1)]
    public ActionResult MyAction()
    {
        //...
    }
}

В этом примере фильтр метода действия будет выполняться раньше, чем файлер на контроллере.

НТН

2 голосов
/ 14 сентября 2010

Я нашел один способ сделать это, немного обманув с помощью упорядочивания, наследования и параметра AttributeUsage

Сначала определите свой ActionFilter для контроллера

[AttributeUsage(AttributeTargets.Class)]
public class FilterController : ActionFilterAttribute
{
    public FilterController()
    {
        this.Order = 2;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (!filterContext.HttpContext.Items.Contains("WeAlreadyWentThroughThis"))
        {
                // do our thing
            filterContext.HttpContext.Items.Add("WeAlreadyWentThroughThis", "yep");
            base.OnActionExecuted(filterContext);
        }
    }
}

Затем наследуйте класс для вашего атрибута действия

[AttributeUsage(AttributeTargets.Method)]
public class FilterAction : FilterController
{
    public FilterAction()
    {
        this.Order = 1;
    }
}

Это далеко не идеально, так как вы должны полагаться на HttpContext и два класса (хотя вы могли бы использовать пространства имен для имен обоих классов одинаково). Но вы получаете принудительную проверку области действия атрибута для класса или действия, и вы не забудете параметр порядка при наборе кода.

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