我正在寫一個從CompositeControl繼承的小型ASP.Net自定義控件。該控件只是一個包含兩個子面板的面板,每個子面板中都有一個標籤。呈現時,我在HTML源代碼中看到,我的自定義控件的第一個子控件獲取兩個id屬性 - 第一個是自定義控件本身的ID,第二個是我分配給第一個子控件的ID屬性。這是爲什麼發生?爲什麼我的ASP.Net自定義控件在我的第一個子控件上呈現兩個id屬性?
代碼:
[ToolboxData("<{0}:MessageBox runat=server></{0}:MessageBox>")]
public class MessageBox : CompositeControl {
private Panel _MessageHeaderContainer = null;
private Label _MessageHeaderLabel = null;
private Panel _MessageDetailsContainer = null;
private Label _MessageDetailsLabel = null;
protected override HtmlTextWriterTag TagKey {
get {
return HtmlTextWriterTag.Div;
}
}
protected override void CreateChildControls() {
// Message header area.
_MessageHeaderContainer = new Panel();
_MessageHeaderContainer.ID = "HeaderContainer";
_MessageHeaderContainer.CssClass = "__MessageBox_Container";
this.Controls.Add(_MessageHeaderContainer);
// Message header text.
_MessageHeaderLabel = new Label();
_MessageHeaderLabel.ID = "HeaderLabel";
_MessageHeaderLabel.Text = "[ Header ]";
_MessageHeaderContainer.Controls.Add(_MessageHeaderLabel);
// Message details area.
_MessageDetailsContainer = new Panel();
_MessageDetailsContainer.ID = "DetailsContainer";
this.Controls.Add(_MessageDetailsContainer);
// Message details text.
_MessageDetailsLabel = new Label();
_MessageDetailsLabel.ID = "DetailsLabel";
_MessageDetailsLabel.Text = "[ Details ]";
_MessageDetailsContainer.Controls.Add(_MessageDetailsLabel);
}
protected override void RenderContents(HtmlTextWriter output) {
AddAttributesToRender(output);
// Render the box.
_MessageHeaderContainer.RenderControl(output);
_MessageDetailsContainer.RenderControl(output);
}
}
用法在ASPX頁:
<cc:MessageBox ID="ctlMessageBox" runat="server" />
HTML輸出:
<div id="ctl00_ctl00_ctlMessageBox">
<div id="ctl00_ctl00_ctlMessageBox" id="ctl00_ctl00_ctlMessageBox_HeaderContainer" class="__MessageBox_Container">
<span id="ctl00_ctl00_ctlMessageBox_HeaderLabel">[ Header ]</span>
</div><div id="ctl00_ctl00_ctlMessageBox_DetailsContainer">
<span id="ctl00_ctl00_ctlMessageBox_DetailsLabel">[ Details ]</span>
</div>
</div>
它也好像我分配給控件本身的任何屬性(即this.CssClass =「xxxx」)被分配給控件的最外面的自動生成的div標記以及第一個子控件的呈現的div標記。 – 2009-10-21 14:14:51
從Render函數中刪除AddAttributesToRender(output)行會停止將根標記的所有屬性添加到第一個子項。我不確定AddAttributesToRender函數的意義是什麼......任何人都可以啓發我爲什麼要調用這個函數? – 2009-10-21 14:46:35
如果您想更多地控制自定義控件渲染的方式,您可以調用它。 它將應該分配給自定義控件(樣式等來自ASPX標記和其他來源)的屬性添加到呈現的下一個標記中。你不需要它,因爲你讓ASP.NET負責渲染。如果你重寫Render方法(就像我的例子),你會需要它。 – 2009-10-21 14:58:56