ASP.NET2.0伺服器控制項之建立自訂控制項

來源:互聯網
上載者:User
本文轉自:http://tech.ddvip.com/2007-05/117993461125583.html
執行個體所用原始碼:http://file.ddvip.com/2007_05/1179934567_ddvip_5087.rar

  摘要

  本文將詳細講解一個簡單的自訂伺服器控制項的建立過程。通過這些內容,讀者將瞭解利用Visual Studio 2005,建立和測試自訂伺服器控制項的基本方法。

  注意:本文內容基於ASP.NET 2.0技術撰寫,應用程式範例使用Visual Studio 2005進行開發。

  建立一個簡單的自訂伺服器控制項

  建立自訂伺服器控制項的過程包括:

  (1)建立一個測試用Web網站應用程式;

  (2)為建立網站應用程式,新增一個Web控制項陳列庫項目;

  (3)編寫、編譯和測試自訂伺服器控制項。

  (1)建立一個測試用Web網站應用程式

  利用Visual Studio 2005,建立Web網站應用程式的方法很多,例如,在本地檔案系統中建立、在IIS支援下建立、在FTP網站中建立、在遠端站台中建立等等。然而,無論如何,開發人員都應首先開啟Visual Studio 2005,然後,單擊"檔案"菜單下"建立網站..."項目。這時,將彈出如1的對話方塊。

 

  圖1 建立網站對話方塊

  圖1是建立網站對話方塊。在該對話方塊中,開發人員需要選擇建立模板,位置、程式設計語言。1所示,樣本採用了ASP.NET網站模板,檔案系統和C#程式設計語言來建立。當單擊"確定"按鈕之後,Visual Studio 2005將在本機D:AppTest下建立一個test1檔案夾。所有應用程式檔案都儲存在檔案夾內。預設情況下,test1檔案夾內包括一個空的用於儲存應用程式資料檔案的App_Data檔案夾,同時還分別包括一個Default.aspx和Default.aspx.cs檔案。

  通過以上步驟就建立了一個Web網站應用程式。該Web網站將用於測試所建立的Web自訂伺服器控制項。

  (2)新增自訂伺服器控制項項目

  在建立Web網站應用程式之後,開發人員還必須在當前網站項目中,添加一個自訂伺服器控制項項目,也就是Web控制項陳列庫項目。實現方法是:在開啟Web網站應用程式的前提下,單擊"檔案"菜單中"添加"項的子項"建立項目"。此時,Visual Studio 2005將彈出2的對話方塊。

 

  圖2 添加新項目對話方塊

  圖2是添加新項目對話方塊。該對話方塊分為三個設定部分:項目類型、模板、名稱和位置。

  在對話方塊左側有一個樹形列表,其中包括各種項目類型。為建立Web控制項陳列庫項目,應選擇"Visual C#"節點的子節點"Windows"。此時,對話方塊右側將出現該子節點對應的已安裝模板,其中包括Windows應用程式、類庫、Web控制項陳列庫等。開發人員應選中"Web控制項陳列庫"一項。最後,需要設定Web控制項陳列庫項目的名稱和位置。為了便於管理,建議將Web控制項陳列庫項目和測試網站項目儲存在同一檔案夾內,因此,本例將名稱設定為"HelloMyControl",將位置設定為D:AppTest  est1。當單擊"確定"按鈕之後,Visual Studio 2005將在D:AppTest  est1目錄下,自動建立一個HelloMyControl用於儲存Web控制項陳列庫相關檔案。同時,Visual Studio 2005的"方案總管"將顯示3所示內容。

 

  圖3 方案總管

  3所示,方案總管中包括兩個項目。一個是前文建立的Web網站項目,另一個是名為HelloMyControl的Web控制項陳列庫項目,其中預設包括一個WebCustomControl1.cs檔案。下面就可以開始編寫、編譯和測試自訂伺服器控制項了。

  (3)編寫、編譯和測試自訂伺服器控制項

  需要實現的自訂伺服器控制項WelcomeLabel功能很簡單。類似於一個標準Label控制項。WelcomeLabel控制項從System.Web.UI.WebControls. WebControl繼承,其中自訂了一個string類型的Text屬性。當控制項運行時,將顯示Text屬性值和目前使用者名的組合文字。例如,將Text屬性值設定為"您好",那麼最終顯示的是"您好,某某!"。開發人員可以用WelcomeLabel控制項作為網站歡迎頁面的一部分。

  WelcomeLabel控制項的實現程式碼封裝含在WebCustomControl1.cs檔案中。該檔案原始碼如下所示。

using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace HelloMyControl
{
 [
AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal ),
AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal ),
DefaultProperty ( "Text" ),
ToolboxData ( "<{0}:WelcomeLabel runat="server" > </{0}:WelcomeLabel>")
 ]
 public class WelcomeLabel : WebControl
 {
// 實現Text屬性
[
 Bindable(true), Category("Appearance"), DefaultValue(""), Description("常值內容."), Localizable(true)
]
public virtual string Text
{
 get
 {
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
 }
 set
 {
ViewState["Text"] = value;
 }
}
// 重寫RenderContents方法
protected override void RenderContents(HtmlTextWriter writer)
{
 // 對Text屬性值編碼,並寫入輸入資料流中
 writer.WriteEncodedText(Text);
 // 判斷Web請求是否有效。如果有效,則設定內容,並寫入輸出資料流中
 if (Context != null)
 {
// 擷取目前使用者名
string s = Context.User.Identity.Name;
// 如果目前使用者名不為空白,則分析使用者名稱並按照指定格式寫入輸出資料流中
if (s != null && s != String.Empty)
{
 string[] split = s.Split('\');
 int n = split.Length - 1;
 if (split[n] != String.Empty)
 {
writer.Write(",");
writer.Write(split[n]);
 }
}
 }
 writer.Write("!");
}
 }
}

 

  代碼說明之控制項基類:

  如果伺服器控制項需要呈現使用者介面(UI)元素或任何其他用戶端可見的元素,則應該從System.Web.UI.WebControls.WebControl(或衍生類別)派生該控制項。如果控制項要呈現在用戶端瀏覽器中不可見的元素(如隱藏元素或meta元素),則應從System.Web.UI.Control派生該控制項。本例顯然需要呈現使用者介面元素,因此,自訂伺服器控制項類WelcomeLabel從WebControl基類繼承。由於WebControl類從Control派生,因此,WelcomeLabel控制項則自動繼承基類提供的成員對象,這些對象多數與使用者介面元素呈現有關,例如,Font、ForeColor、BackColor、Width等等。另外,同樣也是由於從WebControl繼承,因此,WelcomeLabel控制項還自動實現ASP.NET 2.0新增的主題和皮膚功能。實際上,由於WelcomeLabel控制項與ASP.NET 2.0的內建伺服器控制項Label有著很多相似之處,因此,從功能實現的角度出發,最好的方式應該是使得WelcomeLabel控制項類從Label類繼承。然而,本例為了說明定義屬性和定義屬性中繼資料的實現方法,因此,從WebControl基類繼承。

  代碼說明之Text屬性:

  如上原始碼所示,WelcomeLabel實現了一個Text屬性,並使用檢視狀態儲存該屬性值。使用檢視狀態儲存回傳間的Text值。每次回傳時,將重新建立頁並從檢視狀態還原值。如果Text值並未儲存在檢視狀態中,則在每次回傳時會將值設定為其預設的Empty。ViewState屬性繼承自WebControl,是儲存資料值的字典。通過使用String鍵,可輸入和檢索值。本例中將"Text"用作鍵。字典中的項被類型化為Object,然後必須將其強制轉換為屬性類型。

  代碼說明之RenderContents方法:

  通常,在從WebControl派生控制項並呈現單個元素時,應重寫RenderContents方法(而不是Render方法),以呈現控制項標記中的內容。在呈現控制項及其樣式屬性的開始標記之後,WebControl的Render方法將調用RenderContents。如果重寫Render方法以寫入內容,則控制項將丟失產生到WebControl的Render方法中的樣式呈現邏輯。

  在原始碼中,WelcomeLabel控制項重寫了繼承的RenderContents方法以呈現Text屬性及其他一些內容。傳入RenderContents方法的參數是HtmlTextWriter類型的對象,它是具有呈現標記和其他HTML(和HTML變數)標記的方法的工具 + 生產力類。可能讀者已經注意到:WelcomeLabel連續調用了HtmlTextWriter對象的Write方法,而不是先執行字串串聯,然後調用Write方法。這種做法可提高控制項效能。字串串聯需要時間和記憶體來建立字串,然後寫入流。

  代碼說明之中繼資料屬性標記:

  如上代碼所示,在WelcomeLabel類聲明前包括以下3個中繼資料屬性標記。

  (1)AspNetHostingPermissionAttribute

  它是代碼訪問安全屬性。該屬性使JIT編譯器檢查連結到WelcomeLabel的代碼是否具有AspNetHostingPermission許可權。所有的公用ASP.NET類均使用此屬性標記。應將AspNetHostingPermissionAttribute應用於控制項,以對部分受信任的被呼叫者進行安全檢查。

  (2)DefaultPropertyAttribute

  它是設計時屬性(Attribute),它指定控制項的預設屬性(Property)。在視覺化設計工具中,當頁開發人員在設計介面上單擊控制項時,屬性瀏覽器通常反白此預設屬性。

  (3)ToolboxDataAttribute

  它用於指定元素的格式字串。如果在工具箱中雙擊控制項或將其從工具箱拖動到設計介面上時,該字串將成為控制項的標記。對於WelcomeLabel,該字串建立此元素:

<aspSample:WelcomeLabel runat="server"> </aspSample:WelcomeLabel>

 

  另外,在屬性Text的實現過程中還定義了以下中繼資料屬性。

  (1)BindableAttribute(被指定為true或false)

  該中繼資料屬性可用於指定將屬性綁定到資料對視覺化設計工具是否有意義。例如,在VisualStudio2005中,如果屬性標記為Bindable(true),則該屬性可顯示在"資料繫結"對話方塊中。如果屬性(Property)沒有使用此屬性(Attribute)標記,則屬性(Property)瀏覽器會推斷其值為Bindable(false)。

  (2)CategoryAttribute

  該中繼資料屬性用於指定如何在視覺化設計工具的屬性瀏覽器中對屬性進行分類。例如,當頁開發人員使用屬性瀏覽器的分類別檢視時,Category("Appearance")將告知屬性瀏覽器在"外觀"類別中顯示內容。可以根據屬性瀏覽器中的現有類別指定字串參數,也可以建立自己的類別。

  (3)DescriptionAttribute

  該中繼資料屬性用於指定屬性的簡短描述。在VisualStudio2005中,屬性瀏覽器將在"屬性"視窗底部顯示選定的屬性的描述。

  (4)DefaultValueAttribute

  該中繼資料屬性用於指定屬性的預設值。此值應與從屬性訪問器(getter)返回的預設值相同。在VisualStudio2005中,DefaultValueAttribute允許頁開發人員通過在"屬性"視窗中喚出捷徑功能表然後單擊"重設"按鈕將屬性值重設為其預設值。

  (5)LocalizableAttribute(指定為true或false)

  該中繼資料屬性用於指定本地化屬性對視覺化設計工具是否有意義。當某屬性標記為Localizable(true)時,視覺化設計工具會在對本地化資源進行序列化時包含該屬性。對控制項輪詢可本地化的屬性時,設計器會將此屬性值儲存到非特定於地區性的資源檔或其他本地化源中。

  在編寫完成WelcomeLabel控制項的原始碼之後,接著需要編譯和測試所實現的自訂伺服器控制項。為了實現這一目的,開發人員需要在測試用Web網站中引用Web控制項陳列庫項目輸出,並編寫相關代碼以便測試伺服器控制項。

  在Web網站中實現Web控制項陳列庫項目引用的方法比較簡單。首先,按右鍵方案總管中的Web網站項目名稱,在彈出的菜單中選中"添加引用..."一項。此時,將自動彈出4所示的視窗。

 

 

  圖4 添加引用對話方塊

  4所示,在添加引用視窗中包括5個選項卡,其中包括一個名為"項目"的選項卡。單擊它可發現在其列表中包括一個上文建立的HelloMyControl項目。選中該項並單擊"確定"按鈕,即可完成項目引用。

  在完成項目引用後,Visual Studio 2005將自動在Web網站項目中添加一個Bin檔案夾,並在其中包含了HelloMyControl.dll和HelloMyControl.pdb檔案。前者是控制項程式集,後者中則儲存著調試和項目狀態資訊。這樣,Web網站就能夠順利使用HelloMyControl項目的輸出了。如下顯示了為測試WelcomeLabel控制項而建立的Default.aspx檔案原始碼。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="self" Namespace="HelloMyControl" Assembly="HelloMyControl" %>
<!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>
<self:WelcomeLabel Text="您好" ID="WelcomeLabel1" runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
</div>
</form>
</body>
</html>

 

 

  如上粗體代碼所示,頁面首先利用@ Register指令將WelcomeLabel控制項引入,然後,通過<self:WelcomeLabel>標記具體指示控制項的位置,以及屬性設定等。在<self:WelcomeLabel>標記中,主要設定了Text、BackColor和ForeColor屬性,它們分別用於定義控制項的常值內容、背景顏色和前景顏色。

  5顯示了執行Default.aspx的頁面。

 

  圖5 應用程式範例

  小結

  本文通過一個簡單樣本說明了實現自訂伺服器控制項的基本過程。通過這些內容,讀者可能已經發現:建立自訂伺服器控制項與建立普通Web應用程式之間有著較大區別,這些差別主要體現在建立模式、所利用技術等方面。在隨後的系列文章中,將詳細探討利用ASP.NET 2.0技術建立自訂伺服器控制項的相關內容。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.