C# 如何将UserControl添加到另一个UserControl中?

C# 如何将UserControl添加到另一个UserControl中?,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有一个名为UC_Widget的用户控件,它继承自System.Web.UI.UserControl和ITextControl。它还重写函数AddParsedSubObject。当我像下面这样使用它时,它运行良好 <uc1:UC_Widget ID="UC_Widget1" runat="server"> hello world </uc1:UC_Widget> 这将导致无限循环。。。如果UC_小部件包含另一个UC_小部件,则内部UC_小部件也将包含一个UC_小部件

我有一个名为UC_Widget的用户控件,它继承自System.Web.UI.UserControl和ITextControl。它还重写函数AddParsedSubObject。当我像下面这样使用它时,它运行良好

<uc1:UC_Widget ID="UC_Widget1" runat="server">
  hello world
</uc1:UC_Widget>

这将导致无限循环。。。如果UC_小部件包含另一个UC_小部件,则内部UC_小部件也将包含一个UC_小部件,依此类推。您需要想出更好的设计。

虽然可能有更好的设计,但这仍然是可能的

  • 首先评估你不能拉出重复的片段。在您的示例中,您可以*拉出的部分是文本。如果你能把你的控制分成更小的部分,那么你的整体设计就不会那么复杂了
  • 确保定义了停止条件。与任何递归一样,必须使其停止,否则将出现堆栈溢出:)
  • @Tom Vervoort的反例

    <asp:UpdatePanel>
        <ContentTemplate>
            <asp:UpdatePanel>
                <ContentTemplate>
                    Hi there
                </ContentTemplate>
            </asp:UpdatePanel>
        </ContentTemplate>
    </asp:UpdatePanel> 
    
    
    你好
    
    我不相信这一点。可能不是最好的设计,但我认为是可能的。Thx Nix,我遇到了这个错误,控件集合无法修改,因为控件包含代码块(即)。当我执行AddParsedSubObject方法时
    protected override void AddParsedSubObject(object obj)
            {
                if (this.HasControls())
                {
                    base.AddParsedSubObject(obj);
                }
                else if (obj is LiteralControl)
                {
                    HtmlContent.Append(((LiteralControl)obj).Text);
                    this.Text = HtmlContent.ToString();
                }
                else
                {
                    string text1 = this.Text;
    
                    UC_eClinicWidget tmp = obj as UC_eClinicWidget;
                    if (tmp != null)
                    {
                        HtmlContent.Append(GetControlHtml(tmp));
                        this.Text = HtmlContent.ToString();
                    }
                }
            }
    
    <asp:UpdatePanel>
        <ContentTemplate>
            <asp:UpdatePanel>
                <ContentTemplate>
                    Hi there
                </ContentTemplate>
            </asp:UpdatePanel>
        </ContentTemplate>
    </asp:UpdatePanel>