簡體   English   中英

initializeCulture of pages在masterPage中的下拉列表的selectedIndexChange之前觸發

[英]initializeCulture of pages fires before the selectedIndexChange of dropdownlist in masterPage

我有一個帶有語言選擇器下拉列表的母版頁

它有多個使用母版頁的子頁面,但是在子頁面中(我創建了一個basePage類,然后讓頁面繼承)我覆蓋了initializeCulture。 像這樣:

protected override void InitializeCulture()
        {
            String selectedLanguage = Common.SessionManager.Language;

            if (selectedLanguage == "")
            {
                selectedLanguage = ConfigurationManager.AppSettings.Get("defaultLanguage");
            }

            if (selectedLanguage == "")
            {
                selectedLanguage = "nl-BE";
            }

            UICulture = selectedLanguage;
            Culture = selectedLanguage;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);

            base.InitializeCulture();
        }

在下拉列表的SelectedIndexChanged事件中,我在會話中設置新語言,如下所示:

    protected void LanguageSelectorSelectedIndexChanged(object sender, EventArgs e)
    {
        string sCulture = LanguageSelector.SelectedValue;
        Common.SessionManager.Language = sCulture;
    }

但是initializeCulture已經被解雇了。

所以我有一種延遲效果,頁面加載以前的語言,並在下一次回發中正確翻譯。

我不能再次調用initializeCulture,因為我在一個母版頁上,我無法訪問子頁面的basePage類。

有人知道如何解決這個問題嗎?

您可以嘗試通過表單發布值獲取所選語言:

    protected override void InitializeCulture()
    {
        String selectedLanguage = Common.SessionManager.Language;

        if (Request.Form.ContainsKey(myLanguageDropDown.ClientID)
            selectedLanguage = Request.Form[myLanguageDropDown.ClientID];

        if (selectedLanguage == "")
        {
        ...

您不能將事件處理程序用於下拉列表,因為這發生在InitializeCulture() InitializeCulture()在將請求值加載到表單控件之前發生。

因此,從下拉列表中獲取值的正確方法是不使用事件處理程序,並使用InitializeCulture() Request.Form["yourddlid"]來獲取所選值。

protected override void InitializeCulture(){
   Page.UICulture = Request.Form["ddlLanguage"];
} 

在這種情況下,我的解決方案是在更改語言后將頁面重定向到自身。

與“重定向到自身”的答案相同,您可以使用Server.Transfer()而不是Redirect,避免往返客戶端。 像這樣的東西(考慮它在Default.aspx頁面中):

    protected override void InitializeCulture()
    {
        if (Session["LCID"] != null)
        {
            int lcid = (int)Session["LCID"];
            CultureInfo c = new CultureInfo(lcid);
            Thread.CurrentThread.CurrentCulture = c;
        }
        base.InitializeCulture();
    }

    protected void comboCultures_SelectedIndexChanged(object sender, EventArgs e)
    {
        CultureInfo c = new CultureInfo(Thread.CurrentThread.CurrentCulture.LCID);
        if (comboCultures.SelectedItem != null)
            c = CultureInfo.GetCultureInfo(Convert.ToInt32(comboCultures.SelectedItem.Value));
        Session["LCID"] = c.LCID;
        Server.Transfer("Default.aspx");
    }

我已將文化的LCID存儲在組合框值中,但這並不重要。 該技術的核心是用戶Server.Transer(pagename),以便重新啟動頁面工作流,並且Page.InitializeCulture有機會從Session獲取“當前”值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM