[英]masterpage initializeculture no suitable method found to override error?
[英]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.