Rovan

      一个犁牛半块田,收也凭天,荒也凭天, 清茶淡饭饱三餐,早也香甜,晚也香甜, 布衣得暖胜丝绵,长也可穿,短也可穿, 草舍茅屋有几间,行也安然,待也安然, 雨过天青驾小船,鱼在一边,酒在一边, 夜归儿女话灯前,今也有言,古也有言, 日上三竿我独眠,请是神仙,我是神仙.

首页 新随笔 联系 订阅 管理

使用 ASP.NET 2.0 進行個人化

作者:Jayesh Patel、Bryan Acker、Robert McGovern
Infusion Development

2004 年 9 月

適用於:
ASP.NET 2.0
ASP.NET 架構
Visual Studio 2005

摘要:利用 ASP.NET 2.0 中全新的個人化功能,迅速建立個人化應用程式及全新等級的應用程式。

(列印共 21 頁)

目錄

簡介
識別和管理使用者
創造自訂的使用者經驗
簡單的網頁組件
衍生的 WebPart
實作介面
使用提供者存放使用者資料
自訂成員資格提供者
自訂設定檔提供者
自訂個人化提供者
結論

簡介

今日,Web 架構應用程式能服務的商業解決方案越來越多種,加上額外的功能與更快速的網路連線能力,網際網路的基礎結構現在支援的使用者數量和類型也更多更廣。這些使用者因各種原因以眾多不同的裝置來存取網際網路,讓傳統的「匿名」單一使用者 Web 架構不敷所需。

為了因應高彈性及使用者導向 Web 應用程式的全新需求,Microsoft ASP.NET 2.0 加入了一套廣大的個人化架構。ASP.NET 2.0 個人化功能裡包括新的機制,能用來識別和登錄使用者,為特定使用者定製網站並且自動、清楚地儲存使用者資訊。網頁組件讓使用者能夠放入寶貴的資訊。透過版面配置控制項及相關工具的加入,使用者可以建立合於他們體驗的網站,而這些自訂的內容可保留至使用者下次造訪網站時使用。

本白皮書提供一些新功能的概觀,包括網頁組件、驗證控制項和個人化提供者等。若您是初、中級開發人員,或純粹只是對 ASP.NET 2.0 的全新個人化功能有興趣,相信本白皮書中的程式碼範例和功能說明能提供您不少資訊。

個人化程序

在過去,網站是用來將資訊傳達給感興趣的觀眾,某些網站會包含某一概念或產品的相關資訊,提供其他相關資訊來源。現今的網站所提供的用途則較於廣泛,「入口網站」或「中央資訊站」一詞,比較能正確地描繪當今的網站。也正是這類網站當中諸如網頁組件和設定檔服務的個人化功能,能提供觀眾自行設定的網路經驗。隨著公司規模和複雜度與日俱增,資訊的傳遞方式必須受到適當控制且具有高度安全性。若想讓網站得以提供個人化經驗,Web 應用程式必須能執行數種不同的工作:

  • 識別使用者 — Web 應用程式必須有個機制能區分各個使用者的要求。要想識別使用者並將使用者與特定角色相關聯,必須牽涉三個不同的程序:首先,網站必須有一套方法讓使用者能夠確認自己的身分 (驗證);其次,網站還必須有方法識別使用者的要求 (工作階段連續性);最後,網站必須有個機制用以建立和管理新使用者身分識別。
  • 提供個人化經驗 — 個人化網路經驗可能包括允許或禁止特定使用者使用某項功能 (驗證),提供使用者自訂畫面,或追蹤使用者資訊 (例如,購物車) 等。所有這些工作都會依不同的方式來運用使用者的身分識別,以針對每名使用者提供網路經驗。
  • 儲存使用者資訊 — 在大多數情況下,Web 應用程式會需要儲存各個要求或各個工作階段之間的使用者資訊。使用者資訊包括的範圍可能從使用者的身分識別 (登入名稱和密碼),到複雜的喜好設定清單或記錄資料 (例如,亞馬遜網路書店的 "Wish List") 都有。

開發個人化 Web 應用程式的其中一項挑戰,就是設計支援個人化程序必要的架構程式碼。您不僅必須開發每項功能,還必須確保這些功能都能安全、順暢地搭配運作。

ASP .NET 2.0 採用了一系列全新的控制項和技術,為這些問題提供優質的解決方案,而如果預設功能不適用,提供者架構還允許開發自訂解決方案,與系統的其他層面平順地互相搭配。

ASP.NET 2.0 中的個人化

ASP.NET 2.0 能提供專門為每個個人化程序階段而設計的整合式控制項和功能,大幅簡化且強化個人化功能。以 ASP.NET 2.0 的角度來看,個人化支援的三個主要領域為:成員資格、設定檔和網頁組件。本白皮書將更深入探討這些領域。

成員資格

ASP.NET 1.x 提供了一些依賴外部資料存放區或 web.config 檔案內設定的驗證和授權服務。例如,ASP.NET 1.1 應用程式可提供表單型驗證,不過這需要開發人員建立一個登入表單及相關的控制項來擷取、驗證和管理使用者認證。使用者一旦通過驗證,即會透過 web.config 檔案中的 XML 設定來提供授權。

ASP.NET 2.0 以三種不同的方式來擴展這些服務:

  • 登入控制項和使用者控制項 — 新一組的登入及使用者管理控制項使得每個應用程式的標準使用者程式碼的不須重寫。例如,您只要將適當的控制項放到網頁上並設定新屬性,即可建立一組網頁用來登錄新使用者,允許現有的使用者登入,傳送使用者遺忘的密碼給他們。
  • 使用者管理 — 每個 ASP.NET 2.0 應用程式都可以透過一組特殊的管理網頁加以存取,這可讓授權的使用者建立新使用者、指派角色給使用者,並能儲存使用者資訊。若您想要撰寫自己的管理工具,可透過程式控制方式來存取所有相同的功能。
  • 成員資格提供者 — 成員資格功能會在前端功能 (登入控制項和使用者管理站台) 與保存機制之間建立一個連結。成員資格提供者會封裝所有要儲存和擷取使用者及角色所需的資料存取碼。多虧提供者模型,此元件可輕易地由一個支援您特定資料來源的提供者來取代。

這三個元件可相互搭配來減少提供成員資格服務所需的程式碼量,並將成員資格服務與永續性資料存放區相連結。

設定檔

在 ASP.NET 1.x 的應用程式中,使用者專屬的資料通常被存放在工作階段中,並在必要的時候保存於資料庫中。此程序經常沒什麼效率,而且需要開發特殊的架構程式碼。

ASP.NET 2.0 提供一種新的設定檔服務且有助於解決此問題。所謂設定檔單純只是一組與每名使用者相關聯的資料。設定檔可包含任一種可序列化的資料型別,從基本資料型別 (stringint 和其他) 到複雜的物件均可。與 ASP.NET 1.x 不同之處是,設定檔的管理是自動的,ASP.NET 2.0 會負責自動建立和儲存使用者設定檔。

設定檔服務的主要核心是在設定檔提供者,此設定檔提供者內有保存使用者資料並將之載入資料存放區所需的全部程式碼和結構。與成員資格提供者類似的是,設定檔提供者的設計目的是在,能讓您以符合自己所需的資料存放區提供者來取代之 (設定檔提供者)。

網頁組件

網頁組件架構是入口型網站 (採用 HTML 框架) 的進階替代品。基本上,您可以使用網頁組件來建立多元件應用程式,且使用者可以決定要顯示哪個元件、如何設定元件,以及如何在頁面上安排元件等。通過驗證的使用者一旦依想要的方式設定好網頁組件,該版面配置就會自動在工作階段之間保留下來。換句話說,網頁組件可讓您建置出外觀和行為很像桌面的 Web 應用程式。

網頁組件有賴個人化提供者來管理工作階段之間各網頁組件配置的保存性。再次強調,提供者是 .NET Framework 可延伸的一部份,若您不想使用架構中提供的提供者,則可輕鬆建立您自己的提供者。

識別和管理使用者

個人化網站的第一步是設立一套機制用以識別和管理使用者。網站使用者必須要有一種方法對網站確認自己的身分,以便存取個人化內容;而網站管理員則必須要有方法來登錄新使用者、指派使用者特定的角色、刪除使用者和回應對遺失密碼的要求。所有這些功能在 ASP.NET 2.0 都已經過大幅簡化。

識別使用者

傳統的 Web 應用程式系統運用相當廣泛的機制來識別使用者。例如,ASP.NET v1.0 中有四種不同的驗證機制可供選擇,從 Windows 驗證到自訂表單不等。不過,選定驗證機制後,仍然必須藉由建立新使用者、將使用者與角色相連結以及評估網站內的各個角色,來建置您自己的程式碼,以支援使用者基底。雖然像是 Windows 驗證和 Active Directory 等技術有助於解決問題,但 Web 開發人員仍必須撰寫大量的程式碼。

ASP.NET 2.0 以兩種不同的方式來建置基底驗證機制:首先,ASP.NET 2.0 包含一套全新的控制項用,能建置登入和使用者管裡 Web 表單,其次,ASP.NET 2.0 也包含全新的 API,可用來建立使用者帳戶,並將使用者與特定角色相關聯。

此表說明在修護身分識別相關問題時所須的控制項:

名稱 說明
<asp:login> 標準登入功能,讓使用者輸入認證。
<asp:loginname> 顯示登入使用者的名稱。
<asp:loginstatus> 指出使用者是否已通過驗證。
<asp:loginview> 視所選的範本提供不同的登入檢視。
<asp:passwordrecovery> 傳送電子郵件訊息,提供遺失的密碼給使用者。
<asp:CreateUserWizard> 具宣告式設定的使用者變更精靈。
<asp:ChangePassword> 具宣告式設定的密碼建立精靈。

<asp:login> 控制項會建立適當的標籤、文字欄位和按鈕以收集使用者認證。此控制項的外觀和操作可使用內建格式加以修改,或者可使用樣式表來設定。從屬性視窗,也可存取標籤、值和驗證訊息;登入按鈕的外觀也可以經過修改來滿足個別的需要。

<asp:passwordrecovery> 控制項可減少開發人員在處理遺失或遺忘密碼的情況下所需的程式碼量。使用透過 web.config 檔案所設定的 SMTP,密碼復原控制項會將一則包含使用者密碼的電子郵件訊息傳送到之前與該指定帳戶相關聯的電子郵件地址。

使用者管理

為了簡化管理使用者的程序,ASP.NET 2.0 提供一項內建的網站設定工具。網站系統管理工具是一個簡單的網站,只能透過安全連線或直接在 localhost 上存取。藉著此工具,系統管理員可以經由設定如使用者管理、個人化提供者、安全性和設定檔的服務來管理應用程式。網站設定工具提供許多 ASP.NET 2.0 技術的圖形化前端,諸如個人化、成員資格和提供者。

成員資格 API 會公開使用者管理功能,同時由 Profile 物件來處理使用者喜好設定的細節。成員資格 API 也可透過程式控制方式或透過使用者控制項來存取。在需要自訂使用者管理介面的情況下,應該使用 MembershipMembershipUser 物件來保存和擷取使用者細節。針對大多數的驗證考量,登入控制項提供相當強大而且可供設定的機制。

個人化提供者

個人化提供者會建立一個連結,將會提取個人化資料的網頁組件功能以及內含使用者資訊的資料存放區相連接。透過網站系統管理工具,您可設定個人化提供者,並將之連接到 SQL Server 或 Access 資料庫。

[圖 1] 中的架構是 ASP.NET 2.0 系統管理工具和 SQL Server 個人化提供者所使用的架構:

按一下此處放大影像

[圖 1] 產生的資料模型

此架構的資料模型是用來儲存成員資格資料,以便管理個人化網站上的使用者。請注意實際的架構會視您的提供者而異。

雖然 ASP.NET 2.0 有一併提供 SQL Server 和 Microsoft Access 的提供者,但該提供者架構主要供擴充之用。針對其他資料庫或甚至是 XML 檔案建立提供者,現在簡單到只需要開發新的 provider 類別,將使用系統管理工具進行登錄。

管理使用者帳戶

一旦 provider 經過設定而且建立資料存放區後,下一步就是將使用者資訊填入資料存放區。網站系統管理工具有一個簡單的建立使用者表單,可讓系統管理員建立新使用者,及以電子郵件傳送密碼給使用者。

按一下此處放大影像

[圖 2] 使用者建立 — 網站系統管理工具

雖然此 Web 表單對於建立小量的使用者相當有用,但許多網站都支援著上百或上千名登錄使用者。幸虧「網站系統管理工具」只是在系統管理 API 上的 Web 架構殼層。換句話說,建立批次使用者上載程序,或是為使用者建立字型登錄表單,就跟運用適當的 ASP.NET 2.0 類別一樣簡單。

程式化使用者建立

成員資格 API 會封裝所有的使用者維護功能,而且可透過許多類別加以存取。兩個最重要的成員資格類別是 MembershipMembershipUser

System.Web.Security.Membership 類別提供用於建立、刪除、更新和尋找使用者的方法。若要在應用程式內建立使用者帳戶,只需要從 Membership 類別呼叫其中一個 CreateUser() 方法即可。

try {
MembershipUser newUser = Membership.CreateUser("Seth", "trader");
} catch (MembershipCreateUserException mcue) {
string error = mcue.Message;
}

在這種情況下,CreateUser 方法會使用基礎成員資格提供者來嘗試保存新使用者。若失敗,CreateUser() 方法會擲出 MembershipCreateUserException 以指出問題所在。對於例外狀況可查詢 MessageStatusCode 屬性以確定失敗的真正原因。

如需進一步的功能性錯誤處理,您可以使用 CreateUser 多載化版本,這會接受內/外 MembershipCreateStatus 列舉,可針對不同類型的失敗情況提供錯誤碼。

MembershipCreateStatus status;
MembershipUser newUser = Membership.CreateUser(
"Seth", "trader", "seth@boilerroom.com",
"last name?", "Davis", true, out status);
if (status == MembershipCreateStatus.Success) {
Server.Transfer("WebParts.aspx");
} else {
//User creation failed, determine the failure type
string errorcode;
switch (status) {
case MembershipCreateStatus.DuplicateUserName:
errorcode = "Username already exists.";
//resolve error condition and try again
break;
case MembershipCreateStatus.DuplicateEmail:
// Other 8 conditions omitted for brevity

MembershipCreateStatus 列舉會作為輸出參數傳遞給 CreateUser 方法。在完成方法後,可查詢 status 物件以取得錯誤碼,而且可將結果與 MembershipCreateStatus 預先定義的錯誤類型相比對。

順利建立使用者後,該使用者的詳細資料即會封裝到 System.Web.Security.MembershipUser 類別中。MembershipUser 類別可用來確定上次活動的日期、修改密碼或密碼安全問題、修改使用者的註解並且核准/停用使用者帳戶。

程式化角色指派

建立使用者之後,即可透過 System.Web.Security.Roles 物件將該使用者加入某角色。指派 Role 與將使用者名稱連結到角色名稱一樣簡單。

Roles.AddUserToRole("Seth", "Administrator");

請注意 ASP.NET 使用者和角色不一定要連結到 Windows 使用者和角色。

登入控制項再版

大多數功能都包含在 Membership, MembershipUser 中,而 Roles 類別會封裝到登入控制項中。使用登入控制項因而能夠在開發使用者管理時節省您的時間並減少程式碼。例如,使用 Login 控制項和全新的跨網頁張貼功能,就可以建立一個多步驟的使用者登錄程序,收集使用者資訊、驗證資訊,接著,多虧了登入控制項和成員資格提供者,還能自訂建立新使用者。

創造自訂的使用者經驗

多數傳統的 Web 應用程式提供的自訂使用者經驗都不多,之所以如此,是因為除簡單的文字顯示以外,使用者資訊的追蹤、儲存和使用複雜度太高。不過有了 ASP.NET 2.0,您可迅速並輕鬆地建立一個使用者介面,顯示特定的內容、儲存使用者資訊,並允許使用者根據其喜好設定來修改畫面。

設定檔

設定檔是一個可供設定的機制,能為某些使用者建立可存放的資訊桶 (Bucket)。它可用來存放任何資料,包括使用者的名稱到複雜的資料物件等。基本上它會取代在收集使用者資料時所需的保存性程式碼,將之保持到工作階段 (或 Cookie 或資料庫),並確保該項資訊可維持在不同的使用者工作階段。

Profile 物件是使用儲存在 web.config 檔案中作為 XML 元素的 XML 結構描述設定而成。格式正確的設定檔設定存到 web.config 檔案後,就可立即用於 IDE 和 Runtime。設定檔可簡可繁,視應用程式的要求而定。

定義設定檔

設定檔是根據 web.config 檔案中一組特定的 XML 標籤所定義。設定檔中的每個元素都必須至少指定一個名稱,通常再加上資料型別。若未包含任何型別屬性,則會採用 string 預設型別。任何一種資料,從基本的到使用者定義的物件,都可以存到設定檔中。Visual Studio 2005 同時使用 namedata 型別來提供 Intellisense 及執行 Runtime 檢查。

<profile>
<property name="NumberOfApples" type="int" />
</profile>

所建立的屬性會參照為名稱 NumberOfApples,而且將會是個整數。

屬性 (Property) 也可以定義額外的屬性 (Attribute) 來定義其他事項,像是如何儲存設定檔元素以及匿名使用者是否可使用該元素等。

<profile>
<property
name="EmailAddresses"
type="System.Collection.Specialized.StringCollection"
serializeAs="Xml"
allowAnonymous="false"
provider="SQL"/>
<property name="NumberOfApples" type="int" defaultValue="3" />
</profile>

此設定檔會定義 EmailAddress 屬性,來運用許多供屬性使用的參數。此表概述可套用到特定屬性的各個屬性其完整的清單,大部份是選擇性項目。

屬性名稱 選用與否 範例值 說明
name 必要 String 此屬性的唯一識別碼。
type 選用 Primitive | 使用者定義的型別 .NET 基本型別或類別。類別名稱必須具完整格式 (例如 Myapp.UserData.ColorPrefs)。
serializeAs 選用 String | Xml | Binary 保存在資料存放區時的值格式。
allowAnonymous 選用 true | false 限制或允許匿名存取此值。若設為 false,則匿名使用者即無法存取此設定檔值。
provider 選用 String 用來管理此值的提供者。會覆寫 web.config 或 machine.config 中的 defaultProvider 設定。
defaultValue 選用 String 在未明確設定屬性時所傳回的值。
readOnly 選用 true | false 限制寫入權限。

設定檔的各個部份若是由不同的提供者所儲存,provider 屬性則扮演十分重要的角色。例如,專用使用者資料可能是透過資料庫提供者來儲存,而比較不重要 (或可輕易重新建構) 的資料可能就儲存在 XML 檔案中,只要指派特定的提供者,即可以將這兩種資料分開儲存。

群組屬性

在許多情況下,設定檔應該是由組在一起的屬性而組成的,能夠傳達部份商業類型的考量。例如,一組相關的屬性可能代表使用者喜好設定,而其他群組可能表示帳單資訊。在 ASP.NET 2.0 中,屬性可以使用 <group> 標籤群組在一起。

<profile>
<properties>
<group name="Preferences">
<add name="ShowQuoteOfTheDay"
defaultValue="true" type="System.Boolean" />
<add name="ShowNews" type="System.Boolean" />
</group>
<group name="BillingAddress">
<add name="Street" type="System.String" />
<add name="City" defaultValue="Toronto" type="System.String" />
<add name="StateProv" type="System.String" />
<add name="ZipPostal" type="System.String" />
</group>
</properties>
</profile>

請注意每個群組都必須有個唯一的名稱,而該群組當中的元素也應該具備唯一名稱。不過,不同群組內的元素可共用名稱,因為群組關係可區別元素。

存取程式碼中的設定檔屬性

一旦在 web.config 檔案中定義好設定檔後,就可以透過 Profile 物件存取各個的設定檔元素。此物件實際上是在網頁編譯過程中建立的 System.Web.Profile.HttpProfileBase 其中一個特殊的子類別。Profile 子類別會自動包含設定檔中定義的所有屬性和群組其強型別 (Strongly Typed) 存取方法。Profile 物件因此是每個 Web 應用程式的自訂類別。不過,從開發人員的角度來看,Profile 類別建立是自動而且透明的。

Profile 物件提供目前使用者設定檔中各個屬性的讀取權限。若屬性是包含在群組中,則此群組可被視為一個含有子屬性的附加屬性。身為開發人員,您只需要對 Profile 物件撰寫程式,而 ASP.NET 會自動代您處理載入和儲存 Profile

[圖 3] 具有 Intellisense 支援的強型別 web.config 屬性

Visual Studio 2005 會立即將變更反映到 web.config 檔案。只要 web.config 一儲存,即可透過 Intellisense 存取屬性。換句話說,若需要在開發過程修改設定檔,Visual Studio 2005 可立即看出該變更並提供適當的工具支援。

網頁組件

WebPartManager 繫結並包含在 WebPartZones 中的網頁組件,是一個模組化元件,可供使用者加入並安排以建立一個有效率、沒有散佈著不必要的細節的介面。使用者可以:

  • 選擇要顯示的哪個組件
  • 以任一順序或安排方式來設定組件。
  • 儲存一個 Web 工作階段的檢視以用於下個工作階段。
  • 自訂特定網頁組件的外觀。

所有這些功能實際上都有可能在普通的 Web 應用程式實作。

網頁組件架構

您可以把網頁組件想成是模組化的網頁區塊。每個區塊都可從網頁在 Runtime 時動態地新增或移除。組織和操作網頁組件的程式碼已內建在 ASP.NET 2.0 中。所有用於新增、移除和設定版面配置的功能都會自動由網頁組件系統處理。程式設計師只要建置網頁組件並將之指派到網頁組件區域即可。使用者可混合搭配網頁組件,以任何順序加以顯示,並可預期設定會存在網站造訪之間。網頁組件的所有功能,包括新增、移除和列示,都是使用 WebPartManager 自動管理。

網頁組件架構的主要元件是:

  • System.Web.UI.WebControls.WebParts.WebPart 類別 — WebPart 是允許子類別成為網頁組件區域的成員的基底類別大綱設定屬性。一般而言,會將一或多個控制項封裝到 WebPart 的子類別,或者在單一使用者控制項包裝 GenericWebPart
  • System.Web.UI.WebControls.WebParts.WebPartZone 控制項 — WebPartZone 控制項是網頁組件集合的包裝函式。WebPartZone 提供網頁組件的基礎結構,並且用於定義該區所佔用的螢幕區的外觀和操作。
  • System.Web.UI.WebControls.WebParts.WebPartManager 控制項 — 一個 WebPartManager 會連結到使用網頁組件的每一頁。WebPartManager 會設定和維護網頁上所有網頁組件的狀態。

這三個控制項結合起來可建立視覺上和功能上與複雜的桌面應用程式相類似的網頁。

建置網頁組件

網頁組件的建置方法有三。方法一,您可以將一般的使用者控制項丟到 WebPartZone 上,使用者控制項會自動封裝到 GenericWebPart 包裝函式。此一建立網頁組件的方法是將個人化擴充到使用者控制項最簡單的方法。

方法二,您可以建立一個擴充 WebPart 類別的控制項。若想要更改網頁組件的表現方式或希望對網頁組件功能和屬性有較大的控制項,在此建議您使用此方法。不過,您必須開發一個伺服器控制項,其中牽涉到的程式碼以及開發工作比使用 GenericWebPart 更複雜。擴充基本 WebPart 類別通常是比實作介面還恰當的選擇,因為您可從使用 WebPartManager 當中自動繼承程式碼來處理動詞命令和使用者動作。一旦繼承該類別,只需要多載 RenderContents() 方法,即可產生您網頁組件專屬的內容。

第三種方法,您可以實作 IWebPartIWebActionable 介面。IWebPart 介面會定義數個與 WebPart 運作方式相關的方法。最重要的方法是 RenderContents(),這可讓您產生網頁組件的輸出。另一方面,IWebActionable 介面會定義網頁組件必須如何支援動詞命令和使用者動作的方式。

簡單的網頁組件

建立網頁組件最簡單的方法是將任一使用者控制項拖曳到一個現有的 WebPartZone 上。這個方法可讓您快速開發網頁組件,而且非常適合開發靜態內容。建立起來雖然簡單,但這套建立網頁組件的方法卻有眾多限制。第一,每個加入 WebPartZone 的控制項都會有自己的 GenericWebPart 包裝函式。因此,加入多個控制項會造成建立許多網頁組件。第二,控制進階網頁組件功能的網頁組件屬性不能用於一般網頁組件。若想要使用 GenericWebPart,最佳的方法是建立一個其中包含所有小型控制項和內容的自訂使用者控制項。接著就可以將自訂控制項拖放到 WebPartZone 並建立單一網頁組件。

請注意您絕對看不到 GenericWebPart 包裝函式。在 Runtime 時,網頁組件架構會自動將 GenericWebPart 包裝函式注入控制項樹狀結構中。換句話說,在使用者控制項周圍建立此包裝函式類別的機制是自動的,而且是由 ASP.NET 2.0 編譯器在背景執行。

衍生的 WebPart

要想顯露網頁組件的完整功能,您可擴充 WebPart 類別來建立一個自訂的網頁組件。建立自訂網頁組件所涵蓋的步驟,與建置自訂使用者或伺服器控制項必要的步驟類似。首先,建立一個擴充 WebPart 類別的物件。

using System;
using System.Text;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI;
namespace PartsLibrary {
public class announcementControl : WebPart {
public announcementControl() {}
protected override void
RenderContents(HtmlTextWriter writer) {
writer.Write(
"Dr. William K Chin discovers new treatment for Ranaud's!");
}
}
}

上列的程式碼會建立 WebPart 的子類別,並覆寫 RenderContents() 方法以列印出一則訊息。為了單純起見,此範例相對較為簡單。不過在現實狀況中,announcementControl 可封裝複雜的商業邏輯。請注意該類別是在 PartsLibrary 命名空間中定義,而且應該編譯成組件。

接下來,在您想要使用 announcementControl 網頁組件的 Web 專案中加入參照到該組件。現在只要將網頁組件從工具箱拖放或直接加入程式碼到 ASPX 網頁,就可以將該網頁組件加入應用程式的網頁。以下程式碼舉例說明登錄和產生 annoucementControl 實體所需的原始碼。

<%@ Register TagPrefix="jc1" Namespace="ClassLibrary1" Assembly="ClassLibrary1" %>
A?A…
<asp:WebPartZone ID="BottomZone"
Runat="server" Height="45px" Width="760px">
<PartTitleStyle Font-Bold="True"
BackColor="Black" ForeColor="DarkKhaki">
</PartTitleStyle>
<RestoreVerb ImageUrl="~/images/RestoreVerb.GIF">
</RestoreVerb>
<HeaderStyle BackColor="Black"
ForeColor="DarkKhaki"></HeaderStyle>
<MinimizeVerb ImageUrl="~/images/MinimizeVerb.GIF">
</MinimizeVerb>
<ZoneTemplate>
<jc1:announcementControl
Runat="server" ID="AnnouncementControl1"
ForeColor="#C00000"
BackColor="Silver" Title="Announcements"
AllowHide="False" AllowMinimize="False"
AllowClose="False" />
</ZoneTemplate>
</asp:WebPartZone>

登錄指示詞會在自訂網頁組件加上 jc1 前置詞,進而讓組件中的全部控制項 (即 announcementControl) 能夠用於此網頁。自訂網頁組件 jc1:announcementControl 完全是可設定的,並且會公開諸如 AllowHideAllowMinimize 的網頁組件屬性以進行設定。這些選項在使用簡單網頁組件建立方法時無法使用。

[圖 4] 具動詞命令控制項的網頁組件

請注意 [圖 4] 中的宣告網頁組件並不會提供標準的動詞命令給使用者。在上列的程式碼中,該些屬性會停用。藉由停用特定網頁組件功能,能確保必要的網頁元素不會遭到使用者意外地移除。

使用這套建立網頁組件的方法也可公開更多功能,例如與個人化提供者的協調,以便在多次網站造訪之間保持使用者喜好設定的細節。

實作介面

建立網頁組件的最後一個選項是實作 IWebPartIWebActionable 介面。直接實作介面可讓開發人員修改網頁組件架構基本的表現方式。您應該在想要直接控制網頁組件如何運作的各層面時,才使用此方法。在大多數情況下,應該只要擴充 WebPart 類別,並避免重寫全部的網頁組件功能。

網頁組件區域

網頁組件區是包含網頁組件集合的空間區域。網頁組件區域是一個容器,定義著一些可加以操作以變更其內含領域的元件外觀和操作的屬性。

每個網頁組件區域都應該包含用於徹底完成特定工作所需的使用者介面元素和控制項。所有網頁組件區域也應該包含相互獨立的功能。透過確定每個網頁組件區域內所含的功能彼此各自獨立,開發人員可讓使用者免掉對複雜使用者介面管理的擔憂。

網頁組件區域是在 .aspx 網頁中使用 <asp:WebPartZone> 控制項標籤定義而成。以下程式碼說明一個典型的網頁組件區域定義,當中包含宣告網頁組件。請注意下列程式碼不是完整的 .aspx 網頁。

   <asp:WebPartZone ID="BottomZone" Runat="server"
Height="45px" Width="760px">
<PartTitleStyle Font-Bold="True"
BackColor="Black" ForeColor="DarkKhaki">
</PartTitleStyle>
<RestoreVerb ImageUrl="~/images/RestoreVerb.GIF">
</RestoreVerb>
<HeaderStyle BackColor="Black" ForeColor="DarkKhaki">
</HeaderStyle>
<MinimizeVerb ImageUrl="~/images/MinimizeVerb.GIF">
</MinimizeVerb>
<ZoneTemplate>
<jc1:announcementControl Runat="server"
ID="AnnouncementControl1"
ForeColor="#C00000" BackColor="Silver"
Title="Announcements"
AllowHide="False" AllowMinimize="False"
AllowClose="False" />
</ZoneTemplate>
</asp:WebPartZone>

網頁組件區域必須以唯一識別碼屬性來設定,網頁組件管理員控制項會將之用來識別網頁當中特定的區域。在編輯頁面配置時,標題會顯示為網頁組件區域的標頭。

網頁組件動詞命令

網頁組件動詞命令是可讓使用者執行特定網頁組件相關動作的使用者介面元素。您可把網頁組件動詞命令想作是多數桌上型 Windows 應用程式上的標準命令和圖示。這些動詞命令是由 WebPartZone 所定義,它提供了許多標準動詞命令:CloseMinimizeRestoreHelpEditConnectExport

每個動詞命令都可以設定成網頁組件區域內部的 XML 元素。

<asp:WebPartZone id="Zone1"  runat="Server">
CloseVerb ImageUrl="images/CloseVerb.jpg"
Enabled="True"
Text="Close"
Description="Closes the WebPart"
visible="True" />
<ZoneTemplate>
<custom:QuoteWebPart title="Quotations"
id="QuoteWebPart" runat="Server" />
</ZoneTemplate>
</asp:WebPartZone>

典型的動詞命令包含許多描述其狀態和視覺安排的參數。舉例來說,影像可使用 imageUrl 屬性與動詞命令建立關聯。一般說來,影像是個小型圖示樣式的影像,以符號表示意圖的動作。

動詞命令會顯示在 WebPartZone 標題列的右上角。在預設情況下,動詞命令會顯示為簡單文字。不過藉由指定圖示,您可以建立動詞命令的自訂顯示。

[圖 5] 網頁組件動詞令命

動詞命令也有相關聯的工具提示,可將之設定來提供階層工作的文字說明。新增圖解動詞命令到網頁組件可因此減少用來傳達一般功能的螢幕畫面數量。

範本

在整個 ASP.NET 2.0 中,範本是用來設定使用者控制項的常用元件。網頁組件元件也會運用範本來設定網頁上各網頁組件的外觀和操作。將網頁組件放到 <ZoneTemplate> 標籤中,就可以新增到 WebPartZoneZoneTemplate 會定義其組成網頁組件的預設版面配置。

<ZoneTemplate>
<custom:DrugWebPart Title="Drugs" bgcolor="#333333"
id="DrugWebPart1" runat="server" />
<custom:ScheduleWebPart Title="Schedules"
id="QuoteWebPart2" runat="server" />
<custom:EventsWebPart Title="Daily Events"
id="QuoteWebPart3" runat="server" />
</ZoneTemplate>

存在相同範本內的全部組件都會採用相同的外觀和操作。請注意 CatalogZoneEditorZone 也會定義一個 ZoneTemplate,而這些區域的 ZoneTemplate 可能會採用有別於標準網頁組件區域之不同的外觀和操作。例如,您可能想要在使用者進入目錄模式時更改外觀和操作來強調那是目錄區域。藉由使用範本控制項,ASP.NET 2.0 允許開發人員以宣告的方式來定義網頁組件的外觀和操作。範本也可促進控制項有更加一致的 UI,而以這些互動的元件改進使用者經驗。

網頁組件管理員

使用網頁組件的每一頁必須加入一個網頁組件管理員,而且只能加入一個。該管理員控制項必須在任何網頁組件區域前加入,而且負責追蹤網頁上所有網頁組件的狀態。

網頁組件管理員控制項的 DisplayMode 屬性特別重要,因為它定義著提供給使用者的設定選項類型。DisplayMode 具有數個可能的值。

  • Catalog — 顯示網頁組件清單,並允許組件經過重新安排。
  • Design — 允許使用者重新安排網頁上的網頁組件。
  • Edit — 允許使用者編輯個別網頁組件特定的屬性。
  • Connect — 提供兩個網頁組件之間的通訊。
  • Browse (預設值) — 顯示套用有使用者喜好設定的網頁。

開發人員可使用不同的模式向使用者公開期望的功能。例如,在 [圖 6] 所述的目錄模式可讓使用者選擇要顯示哪個網頁組件。在目錄模式中,WebPartManager 的目錄區域會讓使用者看得見。使用新增按鈕可將網頁組件選取起來,接著新增到網頁的其中一區。這是唯一一個可將網頁組件新增到頁面的模式。

[圖 6] 目錄模式 — 網頁組件

典型的目錄會包含數個不同的網頁組件,當中的每個組件會顯示特定的資訊或允許使用者存取特定的功能。例如,[圖 6] 中的目錄是某醫院入口網站的一部份。醫生、護士和行政人員全都使用此入口網站來存取門診資訊、日常活動、公告和病人病況。該入口網站包含了病人資訊,所以安全性無疑是很重要的考量。入口網站因此借重成員資格服務來識別每名使用者,並決定要顯示的資訊。

一旦使用者選好要新增到區域的組件,就可以按一下 [Close] 按鈕切換回瀏覽模式,並查看產生的配置結果:

按一下此處放大影像

[圖 7] 瀏覽模式 — 網頁組件

例如,[圖 7] 顯示 Jayesh Patel 醫生的網頁組件配置 Patel 醫生選擇顯示目前病例單 (左上)、藥物查詢 (左下) 和帳單資訊 (右) 的網頁組件。

使用 ASP.NET 內建拖放功能可將網頁組件從其中一個網頁組件區域移到另一個。例如,Patel 醫生可能會決定將病例單和帳單資訊組合在網頁的右手邊。

按一下此處放大影像

[圖 8] 拖放 — Web

[圖 8] 顯示從 leftzone 拖曳到 mainzone 的網頁組件。任何可用的網頁組件都可以放在任何網頁組件區域中。組件一旦經使用者重新安置,網頁的狀態就會一直保持到第二次儲存動作為止。在後續造訪網站時,即會回復到使用者的網頁組件配置。

個人化提供者

網頁組件配置和設定是由個人化提供者儲存。此提供者在無障礙地控制保存使用者方面,與成員資格提供者和設定檔提供者相似。然而,個人化提供者是專門用於為每名使用者儲存網頁組件設定。

使用提供者存放使用者資料

提供者模型在整個 ASP.NET 2.0 中被用作為擴充和強化架構的機制。因此提供者同時是個模式,也是開發人員能夠擴充 ASP.NET 2.0 架構以滿足特定需要的點。例如,開發人員可以建立新的提供者來支援使用者身分識別系統,或用於將個人化資料存放在替代的資料存放區。

絕大部份的自訂提供者都可與資料庫後端系統互動。然而,程式設計師可使用任何媒介或演算法自由地實作必要的提供者方法和類別,只要他們達到模型必要的介面規格即可。

提供者模型

提供者模型是自許多廣為接受的模式衍生而來。該模型定義著一組類別並連接至資料保存層,從該保存層可存放和擷取指定要求。在這種情況下,提供者模型扮演的角色如程式設計規格,允許 ASP.NET 2.0 符合特殊用戶端的考量。

關於個人化,ASP.NET 2.0 採用三種不同的提供者:

  • Membership — 成員資格提供者支援使用者驗證和使用者管理。
  • Profile — 設定檔提供者支援與設定檔相連結的使用者專屬資料的存放和擷取。
  • Personalization — 個人化提供者支援每名使用者之網頁組件和版面配置的保存性。

每一種提供者都各自獨立於其他提供者。因此您可以取代設定檔提供者,且不會對成員資格提供者造成任何問題。

選擇現有提供者

ASP.NET 2.0 在每種提供者都隨附兩個預設提供者。其中一個提供者連接到 SQL Server,另一個則連接到 Microsoft Access。如之前所指出,提供者即使是共用同一個資料存放區,也是完全獨立。

選擇正確的提供者因此是一件將您的需要與資料存放區的功能相配的工作。例如,AccessPersonalizationProvider 連接到 Microsoft Access,而主要是針對個人化資料清楚直接的小型網站。部署工作在使用 AccessPersonalizationProvider 時已經過大幅簡化,因為 Microsoft Access 並沒有與 Microsoft SQL Server 一樣的需求。不過,SqlPersonalizationProvider 提供更大的彈性和可設定性,而且主要是針對 Acess 資料庫的延展性會是個問題的情況。

其他提供者類型也可作出類似的分析。最後,如果 Access 或 SQL Server 都不符您的資料存放需要,您可以建立自己的提供者,並使用系統管理網站將之插入架構中。

開發自訂提供者

建立新提供者就跟實作一個符合提供者功能需求的新類別一樣簡單。類別一經開發完成後,就可以使用網站維護工具來登錄,進而將之視為正確類型的提供者。

在已存在個人化資料或個人化資料過於複雜而無法使用預設提供者管理時,就應該考慮自訂提供者解決方案。若應用程式需要跨多個資料來源的個人化資料,如 LDAP 目錄中的使用者資料和後端人力資源存放庫的個人資訊,即可採用自訂提供者與同性質的資料系統互通。

自訂成員資格提供者

建立自訂成員資格提供者包含數個步驟:

  1. 撰寫衍生自 System.Web.Security.MembershipProvider 的新類別。
  2. 使用「Web 組態工具」來登錄提供者。您可以加入新的 <connectionStrings> 元素和 <membership> 元素以手動方式登錄提供者。
    <configuration>
        <connectionStrings>
        <add name="MembershipProviderConnection"
        connectionString="DATA\mydb.mdb" />
        </connectionStrings>
        <system.web>
        <membership defaultProvider="FlatFileProvider">
        <providers>
        <add connectionStringName="MembershipProviderConnection"
        applicationName="/DoctorPortal"
        description="Flat file membership provider"
        requiresUniqueEmail="true"
        enablePasswordRetrieval="false"
        enablePasswordReset="true"
        requiresQuestionAndAnswer="false"
        passwordFormat="Hashed"
        name="catdog"
        type="MyCode.Membership.FlatFileProvider,
        MyCode.Membership,
        Version=1.1.1300.0, Culture=neutral,
        PublicKeyToken=xxxxxxxxxxxxxxxx" />
        </providers>
        </membership>
        //other configuration pieces
        </system.web>
        

    請注意無論您採用哪種方式登錄提供者,都可以宣告該提供者是否支援不同的成員資格功能,如自動密碼擷取或實際的密碼格式。

  3. 提供資料存放區 (資料庫或其他資料來源) 給應用程式。

一旦成員資格提供者建立完成,就可以使用您自己的資料存放區來組織和維護使用者和角色。

自訂設定檔提供者

開發自訂設定檔提供者需要的程序也很類似,但實作類別必須衍生自 System.Web.Profile.ProfileProvider 類別。ProfileProvider類別是衍生自 System.Configuration.SettingsProvider,其依次繼承自 System.Configuration.Provider.ProviderBase。因此,任何自訂設定檔提供者都應該實作 ProfileProviderSettingsProviderProviderBase 抽象類別所需的全部方法。

接著可設定個人化架構透過在 web.config 檔案中加入新項目來使用自訂提供者。

<profile defaultProvider="OdbcProvider">
<providers>
<add name="OdbcProvider"
type="Samples.AspNet.Profile.OdbcProfileProvider"
connectionStringName="OdbcProfile" />
</providers>
</profile>

前列程式碼說明 web.config 檔案的設定檔區段。一個名為 OdbcProvider 的自訂設定檔提供者會加入提供者清單中。設定檔標籤在 OdbcProvider 有設定自己的 defaultProvider 屬性。自訂提供者實作所需要的,就只有上述設定,加上 ProfileProvider 類別的有效實作。

自訂個人化提供者

建立自訂個人化提供者也遵循相同的基本程序,但個人化提供者必須衍生自 System.Web.UI.WebControls.WebParts.PersonalizationProvider。一旦建立完成,就可以透過「Web 組態工具」自動登錄該提供者,或藉由在 <personalization> 標籤的 <providers> 區段 (可從巢狀放置於 web.config 檔案的 <webParts> 元素內找到) 加入新項目以手動的方式登錄。

如同其他自訂提供者,您的責任是要建立一個有效的資料來源,並將之提供給應用程式。您的個人化資料來源可以是 XML 檔案,或是 Active Directory 中的項目。不管是哪一種情況,都必須定義適當的結構描述以支援個人化。

結論

個人化網站一直以來都牽涉相當大量且複雜的輔助程式碼。然而,透過 ASP.NET 2.0 中新的個人化功能,開發人員不僅能夠更迅速地建立個人化應用程式,還可以建置全新等級的應用程式。使用者管理系統和登入控制項讓識別使用者的過程甚至比以往更加簡單,而設定檔功能則以迅速且有效的方式來協助儲存使用者資料。無論如何,網頁組件架構都為網站提供了革命性的新設定典範。多虧網頁組件,網站不再受限於構成 HTML 標準的基礎的線性文件格式。網頁組件提供更大的彈性,並允許開發人員建立與最強大的桌面應用程式幾乎無異的 Web 應用程式。

相關書籍

 


關於作者

Jayesh Patel - Jay Patel 是專事 .NET 和 Java 技術的開發人員。Jay 的研究著重在模型架構的程式設計和靈活的方法學。

Bryan Acker - Bryan Acker 是 Infusion Development 的技術作者。Bryan 在 ASP 和 ASP.NET Web 開發及虛擬主機方面有相當有力的背景。

Robert McGovern - Rob McGovern 是 Infusion Development 的資深作者、開發人員兼專案經理。Rob 曾專事於幾個不同的 ASP.NET 專案,包括 CodeNotes for ASP.NET 和 JSP 到 ASP.NET 遷移指南等。

Infusion Development Corporation 是 Microsoft 認證的解決方案提供者,為「財星 1000 大企業」提供自訂化的軟體開發、教育訓練和諮詢服務,其公司重點放在金融服務業。在紐約和多倫多分設有辦公室的 Infusion Development,設立了國際客戶的基礎,其中包括部份在金融服務業、保全經紀業和軟體開發業位屬全球第一大的企業。Infusion Development 的員工也都是 CodeNotes 叢書的作者和創作者。

posted on 2006-04-07 11:01  Ruxuan  阅读(738)  评论(0)    收藏  举报