根據屬性在標記中的呈現形式,ASP.NET 控件屬性可分為簡單屬性與複雜屬性兩大類。理解它們的差異與實作方式,是開發高品質控件的關鍵。
| 類型 | 標記範例 | 說明 |
|---|---|---|
| 簡單屬性 | <asp:TextBox Text="文字" /> |
單一值,直接對應基本型別或字串 |
| 複雜屬性 | <asp:TextBox Font-Bold="True" /> |
連字號語法:父屬性-子屬性 |
<asp:DataList><SelectedItemStyle /></asp:DataList> |
巢狀屬性:以子元素標籤表示物件屬性 | |
<asp:DropDownList><asp:ListItem>...</asp:ListItem></asp:DropDownList> |
集合屬性:包含多個同型別項目 |
以一個自訂的 Metier(職業)列舉為例,示範如何讓複雜屬性在設計器與標記中正常運作:
// 1. 定義列舉
public enum Metier { 教師, 程序員, 作家 }
// 2. 提供 TypeConverter 讓設計器能字串↔列舉轉換
public class MetierConverter : EnumConverter
{
public MetierConverter() : base(typeof(Metier)) { }
}
// 3. 在控件中定義屬性
[Category("Custom")]
[TypeConverter(typeof(MetierConverter))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public Metier UserJob { get; set; } = Metier.程序員;
加上 TypeConverter 後,屬性視窗會顯示下拉選單;DesignerSerializationVisibility.Visible 確保值能正確序列化到 .aspx 標記中(如 UserJob="作家")。
[PersistenceMode(PersistenceMode.InnerProperty)],並實作無參建構函式。ICollection 或繼承 CollectionBase,標記 [PersistenceMode(PersistenceMode.InnerDefaultProperty)],即可支援 <Items><Item /></Items> 語法。善用這些屬性模式,能讓你的控件在 Visual Studio 設計器中擁有原生控件般的優秀體驗。