Asp.net:条件加载用户控件失败

时间:2011-04-29 13:58:51

标签: asp.net user-controls

你好(抱歉标题不好)

我有一个用户控件,可根据以下某些条件加载不同的其他用户控件:

<%@ 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仍然在后台加载(调用页面加载)。

这是为什么?什么是更好的方法?感谢。

3 个答案:

答案 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);
}