Странное поведение с фильтрами действий asp.net mvc AttributeUsage
У меня есть фильтр действий со следующей сигнатурой
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class UnitOfWorkAttribute : ActionFilterAttribute
В соответствии с MSDN:
Свойство AllowMultiple указывает, являются ли несколько экземпляров ваш атрибут может существовать на элементе. Если установлено значение true, несколько экземпляры разрешены; если установлено значение false (по умолчанию), только один экземпляр разрешен.
В MVC поведение кажется немного странным. Когда я украсил действие этим атрибутом, я обнаружил, что метод OnActionExecuting
фильтра был выполнен дважды.
Фильтр был объявлен только в действии, а не на контроллере, и я очистил любые глобальные фильтры. Может ли кто-нибудь объяснить это поведение?
Ответы
Ответ 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 не нужна.