首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 控件開發技巧 (二):關閉基類不必要功能 - 禁用容器集合與隱藏繼承屬性

     編輯:關於ASP.NET

繼承基類雖獲得豐富功能,但並非所有都適合你的控件。本文介紹兩大「減法」技巧:禁用 Controls 集合容器行為、隱藏不需要的繼承屬性。

技巧一:禁用容器功能 - 回傳 EmptyControlCollection

所有繼承 Control 的類別預設擁有 Controls 集合,可當容器使用。若控件純輸出內容 (如 Literal),不應允許加入子控件。

protected override ControlCollection CreateControlCollection()
{
    return new EmptyControlCollection(this);
}
  • EmptyControlCollection 任何 Add/Remove 操作皆拋出 HttpException,明確禁止容器行為。
  • 適用:Literal、Image、Label (若不需當容器) 等葉子控件。
  • 效能:避免建立集合物件、減少序列化 ViewState 開銷。

技巧二:隱藏繼承屬性 - new 關鍵字 + 編輯器屬性

繼承 WebControl 會帶入 BorderColor、BackColor、Font 等 20+ 樣式屬性。若控件不需要 (如資料源控件),可隱藏:

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[Bindable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override Color BorderColor
{
    get { return Color.Empty; }
    set { /* 忽略 */ }
}
  • new 關鍵字隱藏基類實作 (非覆寫),避免多態調用基類邏輯。
  • 四大屬性組合效果:
    1. 屬性視窗不顯示 (Browsable(false))
    2. IntelliSense 不提示 (EditorBrowsable(Never))
    3. 設計器不序列化 (DesignerSerializationVisibility.Hidden)
    4. 資料繫結不包含 (Bindable(false))
  • 同樣適用於 EnableTheming、SkinID、ToolTip、TabIndex 等。

設計原則

「介面隔離原則 (ISP) 在控件開發同樣適用:控件只暴露其真正需要的契約。主動關閉不必要功能,能減少使用者認知負擔、防止誤用、降低序列化/ViewState 開銷。」

下一篇將介紹「HtmlTextWriter 規範輸出」、「分段渲染重構」、「ID 命名策略」與「動態屬性條件輸出」四大渲染最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved