[转]利用ASP.NET 2.0创建自定义Web控件(1)
從使用基本的文本編輯器到創作標記頁面,Web 開發已經經歷了一個漫長的過程。目前,集成開發環境 (IDE) 為開發過程中的幾乎每個方面都提供了圖形化表示形式。此外,還實現各種說明性編程技術以提高效率并降低出現錯誤的幾率。Visual Studio 2005 和 ASP.NET 2.0 中的控件體系結構遵循了這些編程趨勢,并且提供了可靠的、可擴展的環境,該環境設計為使開發人員可以創建能夠以說明方式配置的控件。?
此外,ASP.NET 中新的自適應呈現模型減少了編寫可專門識別其目標瀏覽器的控件的需要。換句話說,控件開發人員可以專注于設計控件,而讓 ASP.NET 框架負責轉換控件并針對不同類型的瀏覽器和設備呈現它。
盡管 ASP.NET 2.0 在控件設計過程中提供了增量改進功能,但實際控件呈現模型已經完全進行了更改。作為自定義控件開發人員,您將會看到利用 ASP.NET 的幾個新選項。最重要的是,您將會發現只需編寫較少的代碼便可完成相同的任務。
在 ASP.NET 2.0 中,創建自定義服務器控件有很多方法,每種方法都有其優點和局限性。本文將討論與自定義控件的創建和配置相關的詳細信息。代碼示例和體系結構概念要求您對 C# 編程語言具有中等水平的理解。
自適應呈現模型
在 ASP.NET 1.x 中,自定義控件開發人員必須設計每個服務器控件,以便它可以識別不同的瀏覽器類型并發出正確的輸出。ASP.NET 1.x 控件框架提供了幾項功能以使該任務變得更簡單,但開發人員仍然必須根據瀏覽器的類型編寫切換程序、開發適當的 HTML,然后針對不同類型的瀏覽器測試控件。此外,如果開發人員希望控件在移動設備上顯示,他必須創建一個與普通 Web 瀏覽器上使用的控件不同的全新控件。
ASP.NET 2.0 通過新的自適應呈現模型簡化了瀏覽器檢測和呈現過程。在 ASP.NET 2.0 中引入的自適應呈現模型旨在用于支持那些眾多能夠使用標記格式(包括 HTML、WML、XHTML 或 CHMTL)的不同設備。
自適應呈現模型體系結構
每個控件都可以鏈接到一個適配器,它會針對特定的目標設備修改控件的行為和標記。例如,HTML 適配器將 ASP.NET 控件生成為標準的 HTML 和 DHTML,以便普通 Web 瀏覽器使用。另一方面,WML 適配器將相同的控件轉換成無線標記語言,以便蜂窩電話或其他移動設備使用。
| 圖 1. 控件-適配器壽命周期 |
上圖說明了控件方法與適配器方法之間一對一的映射。如果有適配器(如果控件的 Adapter 屬性不為空),執行就會在控件和適配器方法之間傳輸,如上圖所示。在生成階段,控件對象或適配器對象都可以生成輸出(通常情況下兩者不同時生成輸出)。通常情況下,如果有適配器,那么適配器的實現將覆蓋控件的實現。在 ASP.NET 2.0 中,自適應呈現模型適用于所有 ASP.NET 控件(不僅僅是移動控件),并且允許 ASP.NET 2.0 支持統一的控件體系結構。
實際意義
自適應呈現模型的實際意義有兩個主要方面。第一,作為開發人員,您可以一次設計控件并期望它可以在具有適配器的任何類型的設備或瀏覽器上使用。第二,您可以對常用適配器利用廣泛的 Microsoft 測試,減少您自己瀏覽器的特定測試。
自適應呈現模型還為 ASP.NET 2.0 提供了將其他服務添加到控件生成過程中的機會。由于具有適配器模型,您可以:?
1) 根據目標的類型,使用篩選器 來更改控件的外觀。?
2) 根據目標的類型,使用模板來更改整個頁面布局。?
3) 根據瀏覽器控制在瀏覽器上的呈現,而不必依賴于 ASP.NET 1.x 的 uplevel/downlevel 確定。?
在本文中,我們將重點放在創建自定義控件的應用方面。但是,請牢記自適應呈現模型是新的基礎框架。
創建自定義服務器控件
Visual Studio 2005 提供了很多用于開發自定義服務器控件的有用工具。為了說明某些功能,我們將創建一個 MailLink 控件,它公開了兩個屬性:Email 和 Text。該控件將生成必需的 HTML 來將所提供的 Text 包裝到 mailto: 鏈接標記中。
創建項目?
在 Visual Studio 2005 中,我們通過在新建項目向導中選擇適當的圖標來創建一個新的“Web Control Library”項目:
| 圖 2. Visual Studio 2005 中的新建項目向導 |
該項目是利用默認的自定義控件類實現創建的。對于我們的示例,我們將該默認文件重命名為 MailLink.cs。
注:在解決方案資源管理器中重命名該文件時,Visual Studio 2005 將會自動更新類名。
MailLink 的源代碼在由項目向導生成的默認模板上構建。MailLink 類從 WebControl 基類自動派生。
| public class MailLink : WebControl { |
WebControl 類提供默認實現方法,可以很簡單地覆蓋這些方法來為我們的控件提供詳細說明。
添加屬性
在 MailLink 示例中,我們需要添加 Email 和 Text 屬性。為了正確配置這些屬性,我們不僅必須編寫代碼,還要分配幾個特性。
| [Bindable(true), Category("Appearance"), DefaultValue(""), Description("The e-mail address.")] public virtual string Email { get {? string s = (string)ViewState["Email"]; return (s == null) ? String.Empty : s; } set { ViewState["Email"] = value; } } |
特性(以粗體表示)定義了新控件將如何與設計器 (Visual Studio) 進行交互。Email 屬性的特性告訴 Visual Studio 如何在設計過程中處理屬性:?
1) Bindable — Email 屬性可綁定 到數據源。您可以將 Email 字段鏈接到數據庫、XML 文件或任何其他 DataSet。該特性強制 Visual Studio 在控件的可綁定屬性列表中顯示 Email 屬性。?
2) Appearance —Email 屬性將顯示在 Appearance 類別下的屬性視圖中。您可以選擇想要的任何類別,包括默認類別:Appearance、Accessibility、Behavior、Data、 Layout 或 Misc。只要用戶選擇了屬性的類別組織方法,Email 屬性將會顯示在 Appearance 下。?
3) DefaultValue — Email 屬性具有一個空的默認值。盡管空值對于 Email 字段來說有意義,但對于您添加到控件中的其他屬性可能并不合適。當用戶將您的控件放到他們的 Web 頁上時,選擇適當的默認值可為用戶免去不計其數的單擊操作。?
4) Description — 屬性說明顯示在控件列表下,并且也可能作為工具提示出現。Email 屬性將具有 The e-mail address 說明。?
5) Localizable — 它會用發送信號的方式通知 ASP.NET 2.0 Framework 該控件包括可以針對不同語言或位置進行配置的文本屬性。?
您可以使用 System.ComponentModel 命名空間中的各種特性來進一步改進任何特殊屬性的外觀和行為。我們將在本文的使用設計器部分中更詳細地介紹修改屬性或控件的行為的方法。
接下來,我們需要添加 Text 屬性。Text 屬性與 Email 屬性稍有不同,因為我們希望將 Text 顯示為由 MailLink 控件發出的 HTML 的一部分。為此,我們需要從 System.Web.UI 命名空間中添加一個新的特性。
| [Bindable(true), Category("Appearance"), DefaultValue(""), Description("The text to display on the link."), Localizable(true), PersistenceMode(PersistenceMode.InnerDefaultProperty)] public virtual string Text {? get { string s = (string)ViewState["Text"]; return (s == null) ? String.Empty : s; } Set {? ViewState["Text"] = value; } } |
Text 屬性的 PersistenceMode(PersistenceMode.InnerDefaultProperty) 特性(粗體代碼)指定設計器應該將該屬性作為控件標記內的內部內容序列化。該特性還聲明 Text 是控件的默認屬性。當用戶在 Visual Studio 中使用這個控件時,Text 屬性將會作為該控件的內部文本自動顯示在圖形設計器上,并且如果用戶單擊該控件并嘗試更改顯示的文本,Text 屬性將會自動更改。
另一方面,應用到屬性的特性會影響設計期間用戶與控件的交互方式。在運行過程中,這些特性被 ASP.NET 運行時忽略。
有關 ViewState 的注釋
請注意,用于兩個屬性的 Get 和 Set 方法都利用 ViewState 對象。ViewState 對象是一個內置到 WebControl 類中的幫助器對象。從開發角度講,ViewState 可被視為一個集合類,用于存儲在回發過程中我們想要保留的任意屬性。實際上,ViewState 封裝了確定如何執行持久性(使用 Cookie、會話等等)所需的所有代碼和邏輯。
生成控件
在定義了控件屬性之后,接下來的步驟就是要設計將由控件發出的實際響應。在 MailLink 示例中,我們希望設計控件來生成基本的 HTML 標記。
TagKey
WebControl 的默認實現會生成一個 標記。我們的 MailLink 控件通過為 TagKey 屬性提供它自己的實現來覆蓋該默認實現。TagKey 屬性定義將要封裝控件內容的最外面的標記。
幸運的是,我們可以使用 HtmlTextWriterTag 枚舉來指示鏈接 標記,而不必實際編寫 HTML 文本。該枚舉方法用于最常用的 HTML 標記。
| protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.A; } } |
如果您需要生成一個不屬于 HtmlTextWriterTag 枚舉的一部分的標記,您必須覆蓋 WebControl.TagName 屬性,而非 TagKey 屬性。TagName 屬性會返回由控件生成的實際 HTML 標記字符串。TagName 的默認 WebControl 實現只調用 TagKey,并以完美的提取方式提取正確的 HTML。
AttributesToRender
在定義了基本標記之后,接下來的步驟就是分配我們要添加到該標記中的各種特性。我們的 MailLink 控件將覆蓋 AddAttibutesToRender 方法以便為“mailto”標記添加適當的標記。
| protected override void AddAttributesToRender( HtmlTextWriter writer){ base.AddAttributesToRender(writer); writer.AddAttribute(HtmlTextWriterAttribute.Href,? "mailto:" + Email); } |
對基類的 addAtributeToRender() 調用會被調用,以確??梢哉_生成其他樣式和特性。如果我們忽略該基本調用,我們可能會失去內置到所有 Web 控件中的母版頁設計、篩選器或其他功能。
RenderContents
最后,由于所需的 WebControl 類的方法和屬性都已被覆蓋,因此可以使用 RenderContents 方法來編寫文本。出于安全原因,MailLink 使用 HtmlTextWriter.WriteEncodedText 方法編寫 HTML 編碼輸出。HTML 編碼安全地將潛在的危險字符轉換為更安全的表示形式。
| protected override void RenderContents( HtmlTextWriter writer) { if (Text == String.Empty) { Text = Email; } writer.WriteEncodedText(Text); } |
請注意,我們只生成 Text 屬性。如果 Text 屬性為空,我們將利用 Email 屬性填充它。請記住,Text 屬性旨在用作控件標記的內部文本。這種類型的控件至少需要某一可顯示的文本(以便用戶進行單擊)。如果我們試圖生成一個空字符串,我們將失去鏈接標記的預期功能。
本文轉自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/sunshine-anycall/archive/2009/04/08/1432004.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的[转]利用ASP.NET 2.0创建自定义Web控件(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cat /proc/maps 进程内存映
- 下一篇: Linux基础之bash脚本进阶篇-循环