我已经构建了一个自定义WebControl,它具有以下结构:
然而,如果我在控件的属性中添加一些asp.net标签和输入控件,它似乎可以正确呈现,但不再起作用(请参见上面的asp.net代码)。我会收到HttpException:
“找不到与标签'KeywordLabel'关联的ID为'KeywordTextBox'的控件。”
这有些可以理解,因为标签在控件集合中出现在文本框之前。然而,默认的asp.net控件确实可以工作,那么为什么这样做不行呢?我做错了什么?一个控件中是否可能有两个控件集合?我应该以不同的方式呈现它吗?
感谢回复。
<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属性,'Contents'和'Footer'。我从未尝试过构建具有多个控件集合的控件,但是我通过以下方式解决了它(简化):
[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:
“找不到与标签'KeywordLabel'关联的ID为'KeywordTextBox'的控件。”
这有些可以理解,因为标签在控件集合中出现在文本框之前。然而,默认的asp.net控件确实可以工作,那么为什么这样做不行呢?我做错了什么?一个控件中是否可能有两个控件集合?我应该以不同的方式呈现它吗?
感谢回复。