2009-11-30 4 views
4

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

Моей единственной заботой в этом подходе является то, что когда-либо созданный новый контроллер будет НАНА наследовать форму базового класса.

Есть ли способ зарегистрировать что-то в global.asax, как и с пользовательскими привязками моделей, которые будут запускать каждый запрос? Kinda как глобальный фильтр действий или что-то в этом роде.

+3

Одним из первых шагов, которые я предпринимаю для каждого проекта, является добавление пустого базового класса контроллера, позволяющего использовать код для всех контроллеров. Я получил привычку после прочтения MVC в действии, где это одно из предложений автора. Я думаю, что подход, который вы сейчас принимаете, является правильным. – mkedobbs

ответ

2

Вместо использования базового класса контроллера (который, по моему мнению, является лучшим вариантом для большинства сценариев), вы можете использовать custom action invoker. Я получал бы от встроенного action invoker и посыпал бы лишние вещи, которые вам нужны. Вы регистрируете действие invoker во время запуска приложения в global.asax и можете переопределять OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted. Например, вы можете использовать OnResultExecuting для добавления в некоторые ViewData. В этот момент вы узнаете, что действие выполнено, а также узнайте тип ActionResult.

+0

Это то, что Я искал и должен хорошо работать. У меня уже есть фабрика пользовательских контроллеров, поэтому я могу отключить сеансы, поэтому добавление этого тривиально. –

2

В global.asax вы можете добавить обработчик к Application_BeginRequest, который запускается перед каждым HTTP-запросом. Вы также можете создать custom HTTP module, чтобы справиться с этим.

+0

Да, я знаю это. Здесь регистрируется весь материал для MVC. В этом нет ничего особенного MVC, но я предполагаю, что есть способ добавить какой-то объект, где я могу использовать его. Например, когда вы добавляете связующее устройство для модели клиента, вы делаете это в файле global.asax: «ModelBinders.Binders.Add (typeof (MyModelBinder, новый MyModelBinder())». Затем, когда происходит привязка к модели, ваш пользовательский класс автоматически вызывается , потому что вы его зарегистрировали, что было сделано в файле global.asax. –

+0

Незначительное примечание: доступ к HttpContext.Current.Session из global.asax не будет работать, поскольку объект Session не установлен на этом этапе. – Moulde

Смежные вопросы