Странное поведение с фильтрами действий mvc asp.net AttributeUsage - PullRequest
13 голосов
/ 18 июля 2011

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

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

По данным MSDN:

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

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

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

Ответы [ 2 ]

31 голосов
/ 09 декабря 2011

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

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

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

0 голосов
/ 01 июля 2012

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

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

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

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

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