如何避免在aspx中初始化web用户控件?

问题描述:

我有一个aspx页面,其中包含一个web用户控件,如下所示。如何避免在aspx中初始化web用户控件?

<html> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:PlaceHolder ID="PlaceHolder1" runat="server"> 
      <uc1:WebUserControl Visible="false" ID="WebUserControl1" runat="server" /> 
     </asp:PlaceHolder> 
     <asp:Label ID="Label1" runat="server" Text="This is visible"></asp:Label> 
    </div> 
    </form> 
</body> 
</html> 

在上述页我设置Visible =真/假(基于一些条件)的WebUserControl1的Page_Load方法。 WebUserControl1本身包含很多控件。但我不想初始化WebUserControl1内的控件。无论如何,我们可以避免初始化WebUserControl1的ChildControls?

+0

它是如何知道_you_足以不初始化控件,但用户控件的开发人员不?如果用户控件想要初始化子控件,那么它期望它们被初始化,并且你最好让它做到这一点。 – 2010-02-23 19:50:42

+0

@约翰:WebUserControl1是一个非常沉重的控制,我宁愿不让它初始化,如果它不可见。 – Amitabh 2010-02-23 20:13:16

从你的描述来看,这听起来像是在用户控件的Init事件中完成的用户控件的繁重工作。我可以建议将这一事件的重要举措放到可能的Load事件上。然后,正如@布莱恩指出的那样,你应该能够检查控制是否可见并且如果是的话就开始繁重的工作。

代码隐藏用户控件:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (this.Visible) 
    { 
     //do heavy lifting here 
    } 
} 

如果你不把某种您是否不能解除的条件,你将永远解除。

+0

我正在检查Page_Load中的Visible属性。但是,如果我的控制不可见,为什么它仍应执行其生命周期事件。 – Amitabh 2010-02-24 08:44:05

+0

您可以将您的控制代码作为原始问题的一部分发布吗?我在这里做了太多猜测工作。不过,我认为你已经接近答案了。 – 2010-02-24 14:06:13

控件将被添加到控件树中,除非动态添加控件(这可能很痛苦),但是您必须处理后端逻辑检查。在您的用户控制代码中,当您尝试处理服务器端逻辑时,需要检查Visible = true,并且只有在处理为true时才处理。