如何将用户控件添加到另一个UserControl?

时间:2010-09-02 11:13:35

标签: c# asp.net user-controls

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

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

但是,它出现了一个问题:如果我想使用此控件来包含另一个用户控件, 我怎么能这样做?很多thx!

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

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();
                }
            }
        }

2 个答案:

答案 0 :(得分:0)

这将导致无限循环...如果UC_Widget包含另一个UC_Widget,那么内部UC_Widget也将包含UC_Widget,依此类推。你需要提出更好的设计。

答案 1 :(得分:0)

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

  1. 首先评估你不能拉出重复的作品。在你的例子中,你可以*拉出的一块就是文字。如果你可以将你的控制权分成更小的部分,它将使你的整体设计变得不那么复杂。
  2. 确保定义停止条件。与任何递归一样,你必须让它停止,否则你将得到Stack Overflow :)。
  3. @Tom Vervoort的反例

    <asp:UpdatePanel>
        <ContentTemplate>
            <asp:UpdatePanel>
                <ContentTemplate>
                    Hi there
                </ContentTemplate>
            </asp:UpdatePanel>
        </ContentTemplate>
    </asp:UpdatePanel>