如何根据条件加载c#ascx用户控件?

如何根据条件加载c#ascx用户控件?,c#,asp.net,ascx,C#,Asp.net,Ascx,我正在将一个aspx网站从单独的aspx语言页面(使用相同的代码)转换为一个带有用户控件的主aspx。我为每种语言都有一个用户控制ascx文件,所有这些文件中都有相同的ID,因此相同的代码可以用于任何语言。如何在不出现编译问题的情况下,对显示给用户的内容进行条件化 使用会话变量session[“lang”] 这就是我所拥有的: <%@ Register TagPrefix="section" TagName="account" Src="account.ascx" %> &

我正在将一个aspx网站从单独的aspx语言页面(使用相同的代码)转换为一个带有用户控件的主aspx。我为每种语言都有一个用户控制ascx文件,所有这些文件中都有相同的ID,因此相同的代码可以用于任何语言。如何在不出现编译问题的情况下,对显示给用户的内容进行条件化

使用会话变量session[“lang”] 这就是我所拥有的:

<%@ Register TagPrefix="section" TagName="account"      Src="account.ascx" %>
<%@ Register TagPrefix="section" TagName="account_span" Src="account_span.ascx" %>
您可以使用-方法动态加载UserControl。有关详细信息,请参见此。
因此,在您的情况下,在页面的CodeBehind(Page Init或Load)中会有如下代码:

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);
}
您可以使用特定模式命名UserControls,并在会话中存储后缀,而不是使用一长串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并正确连接事件处理程序

请您分享一下代码好吗?您不能使用本地化来创建语言相关的页面吗?在这个页面上不需要使用“this”这个词。LoadControl…请注意,当您想要动态加载控件时,会有一些非常特殊的时刻,因为如果页面的生命周期过快,viewstate数据可能无法加载:通常,尝试尽快加载控件(Init是一个好时机,fwiw)
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);
}
string userCtrlSuffix = ((string) Session["UserControlSuffix"]) ?? "Eng";
MyUserControlType ctrl = (MyUserControl) LoadControl("~/PathToUserControl/UserControl" + userCtrlSuffix + ".ascx");
// Initialize properties of ctrl
Controls.Add(ctrl);