2014-01-24 36 views
0

我正在將一個aspx網站從單獨的aspx語言頁面(使用相同的代碼背後)轉換爲帶有用戶控件的一個主aspx。對於每種語言,我有一個用戶控件ascx文件,它們都具有相同的ID,因此後面的相同代碼可以用於任何語言。我如何條件化哪一個顯示給用戶而不會遇到編譯問題?如何根據條件加載c#ascx用戶控件?

使用會話變量會話[ 「郎」] 這是我有:

<%@ Register TagPrefix="section" TagName="account"  Src="account.ascx" %> 
<%@ Register TagPrefix="section" TagName="account_span" Src="account_span.ascx" %> 

編輯:解 這是我最終使用在.aspx

<asp:PlaceHolder ID="PlaceHolder_section" runat="server" /> 

和我在code-behind:section變量中保留了每個部分的名稱和後綴是語言

PlaceHolder_section.Controls.Add(this.LoadControl(section + suffix + ".ascx")); 
+0

你能分享一些代碼嗎?你不能使用本地化來製作語言相關頁面嗎? –

+0

沒有必要在this.LoadControl上使用「this」這個詞。 –

回答

2

您可以使用LoadControl -method動態加載UserControl。有關詳細信息,請參閱此sample
所以你的情況,你有這樣的代碼在你的頁面的代碼隱藏(頁面初始化或加載):

MyUserControlType ctrl; 
if (Session["lang"] == "en-US") 
    ctrl = (MyUserControl) LoadControl("~/PathToUserControl/eng.ascx"); 
else if (Session["lang"] == "es-ES") 
    ctrl = (MyUserControl) LoadControl("~/PathToUserControl/span.ascx"); 
else 
    ctrl = null; 
if (ctrl != null) 
{ 
    // Initialize properties of ctrl 
    Controls.Add(ctrl); 
} 

而不必IFS的一個長長的清單或switch語句中,你可以說出你的一定的模式後,用戶控件,並存儲在會話後綴:

string userCtrlSuffix = ((string) Session["UserControlSuffix"]) ?? "Eng"; 
MyUserControlType ctrl = (MyUserControl) LoadControl("~/PathToUserControl/UserControl" + userCtrlSuffix + ".ascx"); 
// Initialize properties of ctrl 
Controls.Add(ctrl); 

正如在評論中提到@samy,加載控件動態需要在頁面生命週期的早期發生,以正確處理的ViewState和掛鉤的事件處理程序正常。

+1

請注意,由於視圖狀態數據可能無法加載,因此如果您想要動態加載控件,頁面過於先進:通常,儘可能在最快的時刻加載控件(Init是一個很好的時刻,fwiw) – samy