Что происходит между Global.asax и MasterPage? - PullRequest
2 голосов
/ 21 марта 2020

Я начинаю мультиязычную работу. В Global.asax.cs, метод Application_BeginRequest (), считывается повар ie, а CurrentUICulture устанавливается на en-US. Однако в MyPage.aspx значение неожиданно изменилось на nl.

Теперь этот веб-сайт, который я унаследовал, среднего размера и имеет довольно сложную систему меню. Кроме того, он поддерживает пользовательскую таблицу с полем для Preferred Language со значениями вроде nl, но я не смог найти (пока) в коде, где это устанавливает CurrentUICulture из этой пользовательской таблицы.

Это страница с MasterPage, так что я посмотрел туда. Я установил точку останова отладки в событии первой страницы в MasterPage.Page_Init (), а в окне Immediate я проверил System.Threading.Thread.CurrentThread.CurrentUICulture.Name. Значение: «nl». Я полностью озадачен.

Мой вопрос: какой код может выполняться между Global.asax.cs, Application_BeginRequest () и MasterPage.Page_Init ()?

1 Ответ

2 голосов
/ 21 марта 2020

Обработчик Application_BeginRequest() - это первый шаг в жизненном цикле Asp. Net. Смотрите здесь:

https://docs.microsoft.com/en-us/iis/application-frameworks/building-and-running-aspnet-applications/aspnet-integration-with-iis

Когда выполняется обработчик (это ваша страница), он имеет свой собственный жизненный цикл:

https://docs.microsoft.com/en-us/previous-versions/ms178472 (v = vs.140)? Redirectedfrom = MSDN

И эта документация гласит:

Start

На начальном этапе , свойства страницы, такие как запрос и ответ установлены. На этом этапе страница также определяет, является ли запрос обратной передачей или новым запросом, и устанавливает свойство IsPostBack. На странице также устанавливается свойство UICulture.

Когда проверяются доступные события, мы видим:

PreInit

Повышено после завершения этапа запуска и до начала этапа инициализации.

Следовательно; кажется, что самая ранняя стадия, которую вы можете изменить UICulture, это PreInit стадия. Однако наиболее подходящим местом является метод InitializeCulture, который служит для этой конкретной цели c:

public partial class _Default : Page
{
    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);

        HttpCookie languageCookie = Request.Cookies["lang"];
        if (languageCookie != null)
        {
            if (languageCookie.Value == "en")
            {
                base.Culture = base.UICulture = CultureInfo.GetCultureInfo("en-US").Name;
            }
        }
    }

    protected override void InitializeCulture()
    {
        // Or do it here. This is more appropriate.
    }
    ...
    ...
}

РЕДАКТИРОВАТЬ:

Несмотря на то, что информация о культуре распространяется на несколько страниц, информация о культуре не должна быть установленным в обработчиках событий главной страницы, потому что, как видно из следующего вывода трассировки, когда страница использует главную страницу, главная страница интерпретируется как элемент управления страницы, а событие Page_Load этой главной страницы выполняется во время LoadControls (), который выполняется после обработчика страницы Page_Load.

Я также хочу упомянуть здесь функцию трассировки. Включив трассировку, можно увидеть много информации о процессе выполнения страницы, ее дочерних элементах, всех таймингах, заголовках и т. Д. c.:

В файле web.config в разделе <system.web> :

<trace pageOutput="true" requestLimit="10" enabled="true" localOnly="true" traceMode="SortByTime" mostRecent="true"/>

Или читайте здесь для <system.webServer> эквивалента:

https://docs.microsoft.com/en-us/iis/configuration/system.webserver/tracing/

Control Tree
Control UniqueID    Type    Render Size Bytes (including children)  ViewState Size Bytes (excluding children)   ControlState Size Bytes (excluding children)
__Page  ASP.default_aspx    1104    0   0
    ctl00   ASP.masterpage_master   1104    0   0
        ctl00$ctl02 System.Web.UI.LiteralControl    68  0   0
        ctl00$ctl00 System.Web.UI.HtmlControls.HtmlHead 48  0   0
            ctl00$ctl01 System.Web.UI.HtmlControls.HtmlTitle    29  0   0
            ctl00$head  System.Web.UI.WebControls.ContentPlaceHolder    6   0   0
                ctl00$head$ctl00    System.Web.UI.LiteralControl    6   0   0
        ctl00$ctl03 System.Web.UI.LiteralControl    14  0   0
        form1   System.Web.UI.HtmlControls.HtmlForm 954 0   0
            ctl00$ctl04 System.Web.UI.LiteralControl    21  0   0
            ctl00$ContentPlaceHolder1   System.Web.UI.WebControls.ContentPlaceHolder    291 0   0
                ctl00$ContentPlaceHolder1$ctl00 System.Web.UI.LiteralControl    198 0   0
                ctl00$ContentPlaceHolder1$hdn1  System.Web.UI.WebControls.HiddenField   91  0   0
                ctl00$ContentPlaceHolder1$ctl01 System.Web.UI.LiteralControl    2   0   0
            ctl00$ctl05 System.Web.UI.LiteralControl    18  0   0
        ctl00$ctl06 System.Web.UI.LiteralControl    20  0   0
...