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