ASP.NET2.0服務器控件之創建復雜屬性
![]() | ||||
教程推薦 | ||||
| ||||
精彩專題 | ||||
| ||||
主題社區 | ||||
|
下載本文源代碼
上一篇文章介紹了實現3種形式復雜屬性的具體方法。為了加深讀者對于這些實現方法的理解深度,本文詳細講解了一個利用ASP.NET 2.0技術創建復雜屬性的示例。
1. 示例應用
本文所實現的示例很簡單,其核心是通過實現自定義服務器控件的連字符形式復雜屬性來說明復雜屬性的實現方法,其中使用了上一篇文章中介紹的內容。示例效果圖如圖1所示。
![]() 圖1 |
如圖1所示,頁面顯示了公司所在城市、姓名、性別和職務信息。這些內容是定義服務器控件呈現的結果,其中公司所在城市由簡單屬性City設置,姓名、性別和職務由復雜屬性Employee設置,其中包括子屬性Name,Sex和Title設置。下面列舉了示例應用程序的Default.aspx文件源代碼。
| <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="Cp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>實現連字符形式復雜屬性</title> </head> <body> <form id="form1" runat="server"> <div> <Cp:Company ID="demo1" runat="server" City="重慶" Employee-Name="小李" Employee-Sex="男" Employee-Title="銷售經理" /> </div> </form> </body> </html> |
如上代碼所示,主要設置了@ Register指令和自定義服務器控件Company。前者用于為頁面引入自定義服務器控件Company,從而實現控件在頁面中的應用。在自定義服務器控件Company中主要設置了City、Employee-Name、Employee-Sex和Employee-Title。同時,在開發人員編碼過程中將會發現,以上4個屬性均為Visual Studio 2005的智能感知功能所支持。
另外,讀者還可以以另一種非連字符形式設置Company控件屬性。具體代碼如下所示:
| <Cp:Company ID="Company1" runat="server" City="重慶"> <Employee Name="小李" Sex="男" Title="銷售經理"> </Employee> </Cp:Company> |
實際上,以上設置Company控件屬性的方法與前文利用連字符設置屬性的方法是完全一致的。對于所有連字符形式屬性,可以任意使用二者之一。如果是基于代碼可讀性的角度而言,后者比前者的可讀性更強一些。
| 軟件頻道精品推薦 | |||
| | | |
| ![]() | | 更多精彩 |
上一小節中的Default.aspx頁面所包含的Company控件具有3個連字符形式復雜屬性。它們是如何實現的呢?實際上,實現這種形式的復雜屬性關鍵是,在自定義服務器控件實現過程中,對復雜屬性及其子屬性設置特定的設計時元數據。
對于復雜屬性而言,主要在該屬性實現前設置兩個設計時元數據:DesignerSerializationVisibility和NotifyParentProperty。DesignerSerializationVisibility用于指定在設計時序列化組件上的屬性時,所使用的持久性類型。NotifyParentProperty可使得屬性瀏覽器中對子屬性的修改通知一直上傳到對象模型,并在被修改了子屬性的控件中產生修改通知。對于子屬性的設計時元數據設置比較簡單,只需在子屬性實現前設置一個NotifyParentProperty即可。
實現自定義服務器控件Company涉及兩個文件:Company.cs和Employee.cs。前者是自定義服務器控件的實現主體,其中包括各種屬性設置、控件呈現方法RenderContents等等。后者用于實現復雜屬性Employee。下面首先列舉了Company.cs文件源代碼。
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebControlLibrary{ [DefaultProperty("Text")] [ToolboxData("<{0}:Company runat=server></{0}: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)?String.Empty:_city); } set { ViewState["City"] = value; } } //實現屬性Employee [ Bindable(true), Category("Appearance"), Description("員工信息"), DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true) ] public Employee Employee { get { if (employee == null) { employee = new Employee(); } return employee; } } // 重寫RenderContents方法,自定義實現控件呈現 protected override void RenderContents(HtmlTextWriter output) { output.Write("公司所在城市:"); output.Write(City); output.WriteBreak(); output.Write("姓名:"); output.Write(Employee.Name.ToString()); output.WriteBreak(); output.Write("性別:"); output.Write(Employee.Sex.ToString()); output.WriteBreak(); output.Write("職務:"); output.Write(Employee.Title.ToString()); } } } |
以上代碼顯示了自定義服務器控件Company的實現,其中主要包括了一些屬性和RenderContents方法的內容。具體屬性包括2個:一個是簡單屬性City,另一個是復雜屬性Employee。簡單屬性City的實現使用了視圖狀態ViewState。復雜屬性Employee則有些特別,其類型是一個類Employee。同時,該屬性還設置了兩個元數據屬性:DesignerSerializationVisibility(DesignerSerializationVisibility.Content)和NotifyParentProperty(true)。前者可用于指定序列化程序應該序列化屬性的內容即子屬性,后者則可使得屬性瀏覽器中對子屬性的修改通知一直上傳到對象模型,并在被修改了子屬性的控件中產生修改通知。以上兩個設計時元數據屬性的設置是實現連字符形式復雜屬性的關鍵之一。另一個關鍵之處在于為在實現復雜屬性的子屬性時未其設置元數據屬性。
下面列舉了具體實現復雜屬性Employee的Employee.cs文件源代碼。
| using System; using System.Collections; using System.ComponentModel; using System.Globalization; using System.Web.UI; namespace WebControlLibrary{ public class Employee { private string _name; private string _sex; private string _title; //實現構造函數1 public Employee() { } //實現構造函數2 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類,其中包括構造函數和屬性Name、Sex和Title。讀者需要注意,為了實現連字符形式復雜屬性,以上3個屬性都必須設置元數據屬性NotifyParentProperty(true)。這樣,當子屬性發生修改時,.NET框架將自動產生修改通知,并且通知到父屬性Employee。
3. 小結
本文通過一個典型示例介紹了創建連字符形式復雜屬性的實現方法。對于其他形式的復雜屬性,例如,內部嵌套形式復雜屬性、內部嵌套形式默認復雜屬性等,本文將不再做更多解釋。實際上,實現復雜屬性是有其自身規律可循的。只要讀者能夠按照規定的方法實現,基本上都不會出現太大的問題。


