Подтвердить что ты не робот

Странное поведение с фильтрами действий asp.net mvc AttributeUsage

У меня есть фильтр действий со следующей сигнатурой

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute

В соответствии с MSDN:

Свойство AllowMultiple указывает, являются ли несколько экземпляров ваш атрибут может существовать на элементе. Если установлено значение true, несколько экземпляры разрешены; если установлено значение false (по умолчанию), только один экземпляр разрешен.

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

Фильтр был объявлен только в действии, а не на контроллере, и я очистил любые глобальные фильтры. Может ли кто-нибудь объяснить это поведение?

4b9b3361

Ответ 1

Я столкнулся с той же проблемой. (Я установил глобальный фильтр (только один раз) и обнаружил, что его методы IActionFilter и IResultFilter вызывались дважды для каждого запроса. Объект filterContext.HttpContext, передаваемый этим методам, был точно таким же для обоих вызовов.)

Это оказалось связано с использованием Html.Action в представлении. Появляется (смотря на стек вызовов), вызывающий Html.Action повторно обрабатывает метод дочернего действия (во время обработки метода начального действия), и фильтры вызывается для обоих.

Вы можете обнаружить эту ситуацию, проверив свойство filterContext.IsChildAction.

Ответ 2

У меня был метод OnActionExecuting из моего собственного класса фильтра действий, выполняемого дважды.

В какой-то момент я добавил это к моему методу Application_Start в файле global.asax.cs:

GlobalConfiguration.Configuration.Filters.Add(new MyCustomActionFilter());

По-видимому, мой фильтр действий уже был добавлен в коллекцию Filters, которая привела к двойному вызову OnActionExecuting и OnActionExecuted. Так что эта строка в applicationaton_start не нужна.