Дали сайт, с кучей страниц, где каждая страница унаследована от System.Web.UI.Page, а необходимо реализовать многоязычность. Таким образом – овверайдить для каждой страницы определение локали – невозможно, а ходить по всем страницам и менять базовый класс – как-то не хотелось.
Потому решил создать HttpModule, т.к. они вызываются для каждого запроса.
1. создаем класс, инмплементируем интерфейсом IHttpModule, не забывая удалить эксепшн в методе Dispose()
2. функция public void Init(HttpApplication context)вызывается при старте Application и через HttpApplication можем навесить обработчик на начало запроса от пользователя:
context.BeginRequest += (o, e) => { наш код }
context.BeginRequest += (o, e) =>
{
if (context.Context.Request["ui"] != null)
LanguageUtility.SetCurrentCulture(context.Context.Request["ui"]);
else // выглядит не ахти, но это правильно
LanguageUtility.SetCurrentCulture(LanguageUtility.CurrentCulture);
};
3. устанавливаем локаль:
А в LanguageUtility уже запоминаем локаль, в моем случае – в кукисы
Имейте ввиду – устанавливать локаль необходимо постоянно
4. Установка культуры потока:
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(culture);
5. Чтобы модуль заработал – необходимо его зарегистрировать в файле web.config:
<system.web>
<httpModules>
<add name="CultureModule" type="HttpModules.CultureModule" />
</httpModules>
</system.web>
6. собственно – установите бряки и отлаживайте
Имейте ввиду, что подобное можно было сделать и без создания HttpModule, а всего лишь использовать событие Application_BeginRequest класса Global : System.Web.HttpApplication
Но с другой стороны – если придется реализовывать не одну логику проверки на реквесте, а допустим несколько, и возможно – переносить логику на другое приложение, то HttpModule довольно-таки удобная вещь
Комментариев нет:
Отправить комментарий
Можете оставить свой комментарий