Что использовать вместо OnActionExecuting? ASP.NET MVC

2

У меня есть некоторые вещи, которые я делаю в методе OnActionExecuting в BaseController, что все мои другие контроллеры основаны на.

Я делаю несколько простых вещей, например, поместив переменную в ViewData, которая потребует "почти" всех моих представлений и заполняет пару свойств, которые используют мои контроллеры.

Вещь, которая меня беспокоит, эта работа выполняется даже при действиях, которые ей не нужны. Есть ли лучшее место для более эффективного выполнения этой работы? Если мне когда-нибудь понадобится что-то немного "тяжелее", чем то, что я делаю сейчас (т.е. Доступ к БД и т.д.).

UPDATE: Я более конкретно ссылаюсь на типичный сценарий контроллера. Там, где есть несколько действий, которые просто показывают представление. И некоторые из них принимают форму представления, выполняют некоторую работу и перенаправляют на другое действие.

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

Возможно, я не очень хорошо это объясняю... надеюсь, теперь это станет яснее.

ТИА!

Теги:
model-view-controller
asp.net-mvc

2 ответа

3
Лучший ответ

Если вам проще выполнять действия в черном списке (путем атрибуции действий, для которых эта логика не должна выполняться), чем действия с белым списком, вы можете создать атрибут [SuppressWhateverLogic] и применить его к методам, которые вы хотите вложить в черный список. Затем измените свой метод OnActionExecuting(), чтобы искать этот атрибут (через ActionExecutingContext.ActionDescriptor.IsDefined()), и если атрибут существует, то выйдите из логики.

Если вам проще выполнять операции с белым списком, переместите логику из Controller.OnActionExecuting() и создайте собственный фильтр [MyLogic], выполнив подкласс ActionFilterAttribute. Добавьте логику в MyLogicAttribute.OnActionExecuting(), а затем укажите методы, которые вы хотите, с помощью [MyLogic], чтобы связать логику с этими методами.

  • 0
    В настоящее время я не нахожусь в месте, где я могу получить доступ к своему коду, но это звучит как разумное решение. Спасибо!
0

Создайте второй "AdvancedBaseController", который происходит от BaseController?

  • 0
    Ну, в моем типичном контроллере ... есть действия, которые просто показывают представления. Те, которые я хочу, используя работу, которую я выполняю в BaseController. Существуют некоторые действия, такие как действия, которые получают сообщение для выполнения некоторой работы с бэкэндом перед перенаправлением на другое действие. Я хотел бы исключить только тех, кто принимает участие в OnActionExecuting, поскольку это просто добавит время обработки к тем запросам, которые не нуждаются в данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню