initializeCulture of pages在masterPage中的下拉列表的selectedIndexChange之前触发

时间:2011-02-17 11:31:57

标签: c# asp.net c#-4.0 internationalization event-handling

我有一个带有语言选择器下拉列表的母版页

它有多个使用母版页的子页面,但是在子页面中(我创建了一个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类。

任何人都知道如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

您可以尝试按表单发布值获取所选语言:

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

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

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

答案 1 :(得分:1)

您不能将事件处理程序用于下拉列表,因为这发生在InitializeCulture()之后。 InitializeCulture()在请求值加载到表单控件之前发生。

因此,从下拉列表中获取值的正确方法是不使用事件处理程序,并使用Request.Form["yourddlid"]中的InitializeCulture()来获取所选值。

答案 2 :(得分:0)

我的解决方案是在更改语言后将页面重定向到自身。

答案 3 :(得分:0)

与“重定向到自身”的答案相同,您可以使用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获取“当前”值。

答案 4 :(得分:0)

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