ASP.NET 2.0 自訂伺服器控制項支援複雜屬性(巢狀物件屬性),提供連字符語法(Property-SubProperty)與巢狀標記語法(<Property SubProperty="..." />)雙模式,提升標記可讀性與設計工具體驗。本文以 Company 控制項為例,完整示範 Employee 複雜屬性實作。
<%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="Cp" %>
<Cp:Company ID="demo1" runat="server" City="重慶"
Employee-Name="小李" Employee-Sex="男" Employee-Title="銷售經理" />
<Cp:Company ID="Company1" runat="server" City="重慶">
<Employee Name="小李" Sex="男" Title="銷售經理"></Employee>
</Cp:Company>
public class EmployeeInfo
{
public string Name { get; set; }
public string Sex { get; set; }
public string Title { get; set; }
}
[ToolboxData("<{0}:Company runat=server>{0}:Company>")]
public class Company : WebControl
{
// 簡單屬性
public string City { get; set; }
// 複雜屬性:需標記為 [PersistenceMode(PersistenceMode.InnerProperty)]
// 並提供預設實例避免 NullReference
private EmployeeInfo _employee = new EmployeeInfo();
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[NotifyParentProperty(true)]
public EmployeeInfo Employee
{
get { return _employee; }
set { _employee = value ?? new EmployeeInfo(); }
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write($"公司所在城市:{City}
");
output.Write($"員工姓名:{Employee.Name}
");
output.Write($"員工性別:{Employee.Sex}
");
output.Write($"員工職務:{Employee.Title}
");
}
}
| 屬性 | 作用 |
|---|---|
[PersistenceMode(PersistenceMode.InnerProperty)] | 啟用巢狀標記語法,告訴剖析器將子元素對應至此屬性 |
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] | 設計工具序列化時輸出子屬性值,而非參考 |
[NotifyParentProperty(true)] | 子屬性變更時通知父控制項,觸發設計工具重繪 |
上述標記使 Visual Studio 2005 設計工具:
Employee 可展開子屬性 Name、Sex、Title。Employee-Name、Employee-Sex 連字符語法。公司所在城市:重慶 員工姓名:小李 員工性別:男 員工職務:銷售經理
ICloneable 支援深層複製。get 存取器中 new 物件,改用欄位預設實例配合 NotifyParentProperty。TypeConverter 支援字串轉換。雙模式語法支援讓開發者依團隊習慣選擇連字符(精簡)或巢狀標記(清晰),配合設計工具完整體驗,是專業級伺服器控制項的標準配備。