在控件開發系列的第 4 篇中,我們將探討為什麼建議直接繼承 WebControl 而非 Control,以及 WebControl 如何重構了渲染管線。
System.Web.UI.Control:所有伺服器控件的基類,提供 Visible、EnableViewState 等核心屬性。HtmlControl:HTML 伺服器控件基類(對應 <input runat="server">)。WebControl:標準 Web 控件基類(對應 <asp:Button> 等),擴充了樣式、屬性、事件等豐富功能。
直接繼承 WebControl 可免費獲得:統一樣式屬性、工具提示、TabIndex、存取鍵、CSS 類別等 20 多個實用成員,大幅減少重複造輪子。
WebControl 覆寫了 Control.Render,引入「標籤包裹」語義:
protected override void Render(HtmlTextWriter writer)
{
RenderBeginTag(writer); // 輸出開始標籤,如 <table>、<span>
RenderContents(writer); // 輸出內容(預設呼叫 base.Render → 渲染子控件)
RenderEndTag(writer); // 輸出結束標籤,如 </table>、</span>
}
WebControl 自身方法,根據 TagKey 屬性決定輸出何種 HTML 標籤。base.Render(writer),即遞迴渲染子控件。開發者通常只需重寫此方法以輸出自訂內容,或完全重寫 Render 掌控全局。<input>、<img>),設定 TagKey 並重寫 RenderContents 即可。Render 並手動呼叫 RenderBeginTag/RenderEndTag 包裹自訂邏輯。EnsureChildControls(),確保子控件已建立再進行渲染。掌握這套渲染管線,是開發高效能、標準相容控件的基石。