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

时间:2014-01-24 15:04:27

标签: c# asp.net 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" %>

编辑:解决方案 这就是我最终在.aspx

中使用的内容
<asp:PlaceHolder ID="PlaceHolder_section" runat="server" />

以及我在代码隐藏中的内容:section变量保存每个部分名称和后缀是语言

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

1 个答案:

答案 0 :(得分:2)

您可以使用LoadControl - 方法动态加载UserControl。有关详细信息,请参阅此sample 因此,在您的情况下,您将在页面的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并正确连接事件处理程序。