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"]; }