從使用基本的文字編輯器到創作標記頁面,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 運行時忽略。