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

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

它有多个使用母版页的子页面,但是在子页面中(我创建了一个basePage类,然后让页面inheritance)我覆盖了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"]来获取所选值。

与“重定向到自身”的答案相同,您可以使用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存储在combobox值中,但这并不重要。 该技术的核心是用户Server.Transer(pagename),以便重新启动页面工作流,并且Page.InitializeCulture有机会从Session获取“当前”值。

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