開發伺服器控件的第一步是選擇正確的基類,第二步是覆寫 Render 方法輸出客戶端 HTML。三大基類由輕至重:Control、WebControl、CompositeControl。
| 基類 | 命名空間 | 特性 | 適用場景 |
|---|---|---|---|
| Control | System.Web.UI | 最輕量,無樣式支援,僅提供 Render | 非視覺控件、Literal、HiddenField |
| WebControl | System.Web.UI.WebControls | 繼承 Control,加入 Style、CssClass、Enabled 等外觀屬性 | 按鈕、文字框、標籤等視覺控件 |
| CompositeControl | System.Web.UI.WebControls | 繼承 WebControl,實作 INamingContainer,支援子控件集合 | 包含多個子控件的複合控件(如 Login、Wizard) |
繼承關係:Control → WebControl → CompositeControl
protected internal virtual void Render(HtmlTextWriter writer)
{
// writer 由執行階段提供,負責輸出 HTML 字串
// 覆寫此方法撰寫控件的客戶端呈現邏輯
}
public class HelloWorld : Control
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write("Hello World");
}
}
Write(string) / WriteLine(string):直接輸出文字RenderBeginTag(HtmlTextWriterTag) / RenderEndTag():成對輸出標籤AddAttribute(HtmlTextWriterAttribute, string):輸出屬性AddStyleAttribute(HtmlTextWriterStyle, string):輸出內聯樣式Encode(string):HTML 編碼防 XSSpublic class StyledLabel : WebControl
{
public string Text { get; set; }
protected override void RenderContents(HtmlTextWriter writer)
{
writer.WriteEncodedText(Text); // 自動編碼
}
}
WebControl 提供 RenderBeginTag/RenderEndTag 自動輸出外層標籤(預設 span),覆寫 RenderContents 僅需關注內容輸出。