頁面顯示了公司所在城市姓名性別和職務信息這些內容是定義服務器控件呈現的結果其中公司所在城市由簡單屬性City設置姓名性別和職務由復雜屬性Employee設置其中包括子屬性NameSex和Title設置下面列舉了示例應用程序的Defaultaspx文件源代碼
<%@ Page Language=C# AutoEventWireup=true CodeFile=Defaultaspxcs Inherits=_Default %>
<%@ Register Namespace=WebControlLibrary Assembly=WebControlLibrary TagPrefix=Cp %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>
<html xmlns=>
<head runat=server>
<title>實現連字符形式復雜屬性</title>
</head>
<body>
<form id=form runat=server>
<div>
<Cp:Company ID=demo runat=server City=重慶 EmployeeName=小李 EmployeeSex=男 EmployeeTitle=銷售經理 />
</div>
</form>
</body>
</html>
如上代碼所示主要設置了@ Register指令和自定義服務器控件Company前者用於為頁面引入自定義服務器控件Company從而實現控件在頁面中的應用在自定義服務器控件Company中主要設置了CityEmployeeNameEmployeeSex和EmployeeTitle同時在開發人員編碼過程中將會發現以上個屬性均為Visual Studio 的智能感知功能所支持
另外讀者還可以以另一種非連字符形式設置Company控件屬性具體代碼如下所示
<Cp:Company ID=Company runat=server City=重慶>
<Employee Name=小李 Sex=男 Title=銷售經理>
</Employee>
</Cp:Company>
實際上以上設置Company控件屬性的方法與前文利用連字符設置屬性的方法是完全一致的對於所有連字符形式屬性可以任意使用二者之一如果是基於代碼可讀性的角度而言後者比前者的可讀性更強一些
using System;
using SystemCollectionsGeneric;
using SystemComponentModel;
using SystemText;
using SystemWeb;
using SystemWebUI;
using SystemWebUIWebControls;
namespace WebControlLibrary{
[DefaultProperty(Text)]
[ToolboxData(<{}:Company runat=server></{}:Company>)]
public class Company : WebControl {
private Employee employee; //實現屬性City
[ Bindable(true) Category(Appearance) DefaultValue() Description(公司所在城市) ]
public string City {
get {
string _city = (String)ViewState[City];
return ((_city == null)?StringEmpty:_city);
}
set { ViewState[City] = value; }
} //實現屬性Employee
[ Bindable(true) Category(Appearance) Description(員工信息) DesignerSerializationVisibility( DesignerSerializationVisibilityContent) NotifyParentProperty(true) ]
public Employee Employee {
get {
if (employee == null) {
employee = new Employee();
}
return employee;
}
} // 重寫RenderContents方法自定義實現控件呈現
protected override void RenderContents(HtmlTextWriter output) {
outputWrite(公司所在城市);
outputWrite(City);
outputWriteBreak();
outputWrite(姓名);
outputWrite(EmployeeNameToString());
outputWriteBreak();
outputWrite(性別);
outputWrite(EmployeeSexToString());
outputWriteBreak();
outputWrite(職務);
outputWrite(EmployeeTitleToString());
}
}
}
實現方法
上一小節中的Defaultaspx頁面所包含的Company控件具有個連字符形式復雜屬性它們是如何實現的呢?實際上實現這種形式的復雜屬性關鍵是在自定義服務器控件實現過程中對復雜屬性及其子屬性設置特定的設計時元數據
對於復雜屬性而言主要在該屬性實現前設置兩個設計時元數據DesignerSerializationVisibility和 NotifyParentPropertyDesignerSerializationVisibility用於指定在設計時序列化組件上的屬性時所使用的持久性類型NotifyParentProperty可使得屬性浏覽器中對子屬性的修改通知一直上傳到對象模型並在被修改了子屬性的控件中產生修改通知對於子屬性的設計時元數據設置比較簡單只需在子屬性實現前設置一個NotifyParentProperty即可
實現自定義服務器控件Company涉及兩個文件Companycs和Employeecs前者是自定義服務器控件的實現主體其中包括各種屬性設置控件呈現方法RenderContents等等後者用於實現復雜屬性Employee下面首先列舉了Companycs文件源代碼
以上代碼顯示了自定義服務器控件Company的實現其中主要包括了一些屬性和RenderContents方法的內容具體屬性包括個一個是簡單屬性City另一個是復雜屬性Employee簡單屬性City的實現使用了視圖狀態ViewState復雜屬性Employee則有些特別其類型是一個類Employee同時該屬性還設置了兩個元數據屬性DesignerSerializationVisibility (DesignerSerializationVisibilityContent)和NotifyParentProperty(true)前者可用於指定序列化程序應該序列化屬性的內容即子屬性後者則可使得屬性浏覽器中對子屬性的修改通知一直上傳到對象模型並在被修改了子屬性的控件中產生修改通知以上兩個設計時元數據屬性的設置是實現連字符形式復雜屬性的關鍵之一另一個關鍵之處在於為在實現復雜屬性的子屬性時未其設置元數據屬性
下面列舉了具體實現復雜屬性Employee的Employeecs文件源代碼
using System;
using SystemCollections;
using SystemComponentModel;
using SystemGlobalization;
using SystemWebUI;
namespace WebControlLibrary{
public class Employee {
private string _name;
private string _sex;
private string _title; //實現構造函數
public Employee() { } //實現構造函數
public Employee(String Name String Sex String Title) {
_name = Name; _sex = Sex; _title = Title;
} //實現屬性Name
[ Bindable(true) Category(Appearance) DefaultValue() Description(員工姓名) NotifyParentProperty(true) ]
public String Name {
get { return _name; }
set { _name = value; }
} //實現屬性Sex
[ Bindable(true) Category(Appearance) DefaultValue() Description(員工性別) NotifyParentProperty(true) ]
public String Sex {
get { return _sex; }
set { _sex = value; }
} //實現屬性Title
[ Bindable(true) Category(Appearance) DefaultValue() Description(員工職務) NotifyParentProperty(true) ]
public String Title {
get { return _title; }
set { _title = value; }
}
}
}
以上代碼實現了Employee類其中包括構造函數和屬性NameSex和Title讀者需要注意為了實現連字符形式復雜屬性以上個屬性都必須設置元數據屬性NotifyParentProperty(true)這樣當子屬性發生修改時NET框架將自動產生修改通知並且通知到父屬性 Employee
小結
本文通過一個典型示例介紹了創建連字符形式復雜屬性的實現方法對於其他形式的復雜屬性例如內部嵌套形式復雜屬性內部嵌套形式默認復雜屬性等本文將不再做更多解釋實際上實現復雜屬性是有其自身規律可循的只要讀者能夠按照規定的方法實現基本上都不會出現太大的問題
From:http://tw.wingwit.com/Article/program/net/201311/13671.html