ASP.NET WebControl和呈现包含子项

时间:2009-11-05 05:07:02

标签: asp.net rendering web-controls

我正在寻找一个可以在其中容纳标记的WebControl,并自己动态创建子控件。我遇到的问题是我不能(还)将标记中的控件(参见下面的示例)与我创建的子控件分开。

我知道我需要用这两个标志来设置类:

[ParseChildren(false)]
[PersistChildren(true)]
public class OuterControl : WebControl
{
  ...
}

样本标记看起来像:

<custom:OuterControl>
  <asp:TextBox ...>
<custom:OuterControl>

RenderContents()中,我有一些控件需要添加到控件树中,渲染,然后渲染包含在特定部分的标记中的控件。 E.g:

protected override void RenderContents(HtmlTextWriter output)
{
  EnsureChildControls();
  [ Misc work, render my controls ]

  [** Would like to render wrapped children here **]

  [ Possibly other misc work ]
}

如上所述,我可以让代码创建的控件在调用 RenderChildren()时呈现两次,或者通过删除该行来使包装的控件完全不呈现。织补。

思想?

1 个答案:

答案 0 :(得分:1)

当我有类似的要求(围绕提供的控件构建一组标准控件)时,我最终做了类似的事情:

EnsureChildControls();

Control[] currentControls = new Control[Controls.Count];

if (HasControls()) {
  Controls.CopyTo(currentControls, 0);
  Controls.Clear();
}

// Misc work, add my controls, etc, e.g.
Panel contentBox = new Panel { ID = "Content", CssClass = "content_border" };
// at some point, add wrapped controls to a control collection
foreach (Control currentControl in currentControls) {
  contentBox.Controls.Add(currentControl);
}

// Finally, add new controls back into Control collection
Controls.Add(contentBox);

这很好。