我正在将一个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"));
答案 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并正确连接事件处理程序。