你好(抱歉标题不好)
我有一个用户控件,可根据以下某些条件加载不同的其他用户控件:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SubPage.ascx.cs" Inherits="SubPage" %>
<%@ Register Src="<srcA>" TagName="A" TagPrefix="CTRL" %>
<%@ Register Src=">srcB>" TagName="B" TagPrefix="CTRL" %>
<% if (someValue == 1) { %>
Loading user control A..
<CTRL:A runat="server" />
<% } else { %>
Loading user control B..
<CTRL:B runat="server" />
<% } %>
结果看起来是正确的;显示预期的内容。但是我注意到即使 someValue!= 1 并且显示了控件B,控件A仍然在后台加载(调用页面加载)。
这是为什么?什么是更好的方法?感谢。
答案 0 :(得分:2)
您需要调用LoadControl
方法
<% if (someValue == 1) { %>
Loading user control A..
Page.LoadControl(("~\ExampleUserControl_A.ascx");
<% } else { %>
Loading user control B..
this.LoadControl(("~\ExampleUserControl_B.ascx");
<% } %>
答案 1 :(得分:2)
调用Page_Load是因为您处理此事件。 不要尝试以这种方式加载它们,而是使用Visible-Property而不是代码隐藏。
公开函数,控制器(在您的情况下为SubPage.ascx
)在更改可见状态后调用以加载UserControl的内容。不可见的控件根本不会呈现为html。
如果您不需要动态加载控件会导致不必要的ViewState或事件处理问题。 Here是关于动态UserControls提到的一些其他缺点。
答案 2 :(得分:0)
代码前线:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SubPage.ascx.cs" Inherits="SubPage" %>
<%@ Register Src="<srcA>" TagName="A" TagPrefix="CTRL" %>
<%@ Register Src="<srcB>" TagName="B" TagPrefix="CTRL" %>
<asp:placeholder id="plhControls" runat="server" />
代码背后:
if (someValue == 1) {
CTRLA ctrlA = (CTRLA)LoadControl("~/Controls/ctrlA.ascx");
plhControls.Controls.Add(ctrlA);
} else {
CTRLB ctrlB = (CTRLB)LoadControl("~/Controls/ctrlB.ascx");
plhControls.Controls.Add(ctrlB);
}