Я создал собственный WebControl, который имеет следующую структуру:
<gws:ModalBox ID="ModalBox1" HeaderText="Title" runat="server">
<Contents>
<asp:Label ID="KeywordLabel" AssociatedControlID="KeywordTextBox" runat="server">Keyword: </asp:Label><br />
<asp:TextBox ID="KeywordTextBox" Text="" runat="server" />
</Contents>
<Footer>(controls...)</Footer>
</gws:ModalBox>
Элемент управления содержит два свойства ControlCollection: «Содержимое» и «Нижний колонтитул». Никогда не пытался создать элемент управления с несколькими коллекциями элементов управления, но решил его так (упрощенно):
[PersistChildren(false), ParseChildren(true)]
public class ModalBox : WebControl
{
private ControlCollection _contents;
private ControlCollection _footer;
public ModalBox()
: base()
{
this._contents = base.CreateControlCollection();
this._footer = base.CreateControlCollection();
}
[PersistenceMode(PersistenceMode.InnerProperty)]
public ControlCollection Contents { get { return this._contents; } }
[PersistenceMode(PersistenceMode.InnerProperty)]
public ControlCollection Footer { get { return this._footer; } }
protected override void RenderContents(HtmlTextWriter output)
{
// Render content controls.
foreach (Control control in this.Contents)
{
control.RenderControl(output);
}
// Render footer controls.
foreach (Control control in this.Footer)
{
control.RenderControl(output);
}
}
}
Однако, похоже, что он отображается правильно, он больше не работает, если я добавлю некоторые метки asp.net и элементы управления вводом внутри свойства (см. Выше код asp.net) Я получу HttpException:
Невозможно найти элемент управления с идентификатором KeywordTextBox, который
связан с меткой KeywordLabel.
В некоторой степени понятно, потому что метка появляется перед текстовым полем в контрольной коллекции. Однако со стандартными элементами управления asp.net это работает, так почему же это не работает? Что я делаю неправильно? Возможно ли даже иметь два набора элементов управления в одном элементе управления? Должен ли я сделать это по-другому?
Спасибо за ответы.