演練:開發和使用自定義服務器控件

此演練演示如何創建和編譯自定義 ASP.NET 服務器控件以及如何在頁中使用該控件。

通過此演練,您將學會如何執行以下任務:

  • 創建一個 ASP.NET 服務器控件。

  • 向該控件及其成員添加元數據以控制安全性和設計時行爲。

  • 使用 ASP.NET 網站中的 App_Code 目錄對控件進行測試(無需手動編譯步驟)。

  • 在配置文件和該控件的程序集中指定一個標記前綴。

  • 將該控件編譯爲一個程序集並將其添加到 Bin 目錄中。

  • 將一個位圖嵌入到該控件的程序集中,以作爲可視化設計器的工具箱圖標使用。

  • 在頁中使用已編譯的控件。

可視化設計工具(如 Microsoft Visual Studio 2005)可以簡化控件的開發過程,但並不是創建或生成自定義控件的必不可少的工具。可以通過使用任何文本編輯器創建控件,並使用屬於 .NET Framework SDK 一部分的編譯器從命令行生成這些控件。無論以何種方式創建控件,在可視化設計器中控件的設計時外觀和行爲都將相同。頁開發人員可將控件添加到可視化設計器的工具箱,可將其拖動到設計圖面上,還可以在屬性瀏覽器中訪問其屬性和事件。在有些可視化設計器(如 Visual Studio 2005)中,自定義控件還可自行支持 IntelliSense。

要創建的控件 WelcomeLabel 是一個簡單控件,與標準的 Label 控件類似。WelcomeLabel 類從 WebControl 派生,它定義了一個 Text 屬性,該屬性允許頁開發人員提供一個文本字符串,以歡迎訪問站點的用戶。如果用戶名出現在用戶瀏覽器發送的標題中,WelcomeLabel 就會將用戶名追加到該文本字符串。有關檢索用戶名的更多信息,請參見 User。例如,如果頁開發人員將“Hello”設置爲 Text 屬性的值,則根據標題中是否出現用戶名,WelcomeLabel 將呈現“Hello, 用戶名!”或“Hello!”。

創建自定義服務器控件的代碼

  1. 創建一個名爲 WelcomeLabel.cs 或 WelcomeLabel.vb 的文件。

  2. 將以下代碼添加到控件的源文件中:

    Visual Basic
    ' WelcomeLabel.vb
    Option Strict On
    Imports System
    Imports System.ComponentModel
    Imports System.Security.Permissions
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Namespace Samples.AspNet.VB.Controls
        < _
        AspNetHostingPermission(SecurityAction.Demand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
        AspNetHostingPermission(SecurityAction.InheritanceDemand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
        DefaultProperty("Text"), _
        ToolboxData( _
            "<{0}:WelcomeLabel runat=""server""> </{0}:WelcomeLabel>") _
        > _
        Public Class WelcomeLabel
            Inherits WebControl
            < _
            Bindable(True), _
            Category("Appearance"), _
            DefaultValue(""), _
            Description("The welcome message text."), _
            Localizable(True) _
            > _
            Public Overridable Property Text() As String
                Get
                    Dim s As String = CStr(ViewState("Text"))
                    If s Is Nothing Then s = String.Empty
                    Return s
                End Get
                Set(ByVal value As String)
                    ViewState("Text") = value
                End Set
            End Property
    
            Protected Overrides Sub RenderContents( _
                ByVal writer As HtmlTextWriter)
                writer.WriteEncodedText(Text)
                If Context IsNot Nothing Then
                    Dim s As String = Context.User.Identity.Name
                    If (s IsNot Nothing) AndAlso (s <> String.Empty) Then
                        Dim split() As String = s.Split("/".ToCharArray)
                        Dim n As Integer = split.Length - 1
                        If (split(n) <> String.Empty) Then
                            writer.Write(", ")
                            writer.Write(split(n))
                        End If
                    End If
                End If
                writer.Write("!")
            End Sub
        End Class
    End Namespace
    
    // WelcomeLabel.cs
    using System;
    using System.ComponentModel;
    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Samples.AspNet.CS.Controls
    {
        [
        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
        {
            [
            Bindable(true),
            Category("Appearance"),
            DefaultValue(""),
            Description("The welcome message text."),
            Localizable(true)
            ]
            public virtual string Text
            {
                get
                {
                    string s = (string)ViewState["Text"];
                    return (s == null) ? String.Empty : s;
                }
                set
                {
                    ViewState["Text"] = value;
                }
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.WriteEncodedText(Text);
                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 派生該控件。WebControl 類從 Control 派生,並添加了與樣式相關的屬性,如 FontForeColorBackColor。此外,一個從 WebControl 派生的控件也自行參與到 ASP.NET 的主題功能。

如果您的控件要擴展現有控件(如 ButtonLabelImage 控件)的功能,則可以從該控件派生。由於 WelcomeLabel 擴展了 Label 控件的功能,因此它可從 Label 派生。但是,本演練從 WebControl 派生 WelcomeLabel 以演示如何定義屬性和定義屬性元數據。

WelcomeLabel 定義一個 Text 屬性,並使用視圖狀態存儲該屬性值。使用視圖狀態保存回發間的 Text 值。每次回發時,將重新創建頁並從視圖狀態還原值。如果 Text 值並未存儲在視圖狀態中,則在每次回發時會將值設置爲其默認的 EmptyViewState 屬性繼承自 WebControl,是保存數據值的字典。通過使用 String 鍵,可輸入和檢索值。本例中將“Text”用作鍵。字典中的項被類型化爲 Object,然後必須將其強制轉換爲屬性類型。有關更多信息,請參見 ASP.NET 狀態管理概述

WelcomeLabel 控件通過重寫繼承的 RenderContents 方法呈現其 Text 屬性。傳入 RenderContents 方法的參數是 HtmlTextWriter 類型的對象,是具有呈現標記和其他 HTML(和 HTML 變量)標記的方法的實用工具類。

注意,WelcomeLabel 會連續調用 HtmlTextWriter 對象的 Write 方法,而不是先執行字符串串聯然後調用 Write 方法。由於 HtmlTextWriter 對象直接寫入輸出流,因此這樣可以提高性能。字符串串聯需要時間和內存來創建字符串,然後寫入流。在控件中實現呈現時,應按照本演練中說明的模式進行操作。

Note注意

通常,在從 WebControl 派生控件並呈現單個元素時,應重寫 RenderContents 方法(而不是 Render 方法),以呈現控件標記中的內容。在呈現控件及其樣式屬性的開始標記之後,WebControlRender 方法將調用 RenderContents。如果重寫 Render 方法以寫入內容,則控件將丟失生成到 WebControlRender 方法中的樣式呈現邏輯。有關呈現從 WebControl 派生的控件的更多信息,請參見 Web 控件呈現示例

應用於 WelcomeLabel 的屬性包含由公共語言運行庫和設計時工具使用的元數據。

在類級別上,通過以下屬性標記 WelcomeLabel

  • AspNetHostingPermissionAttribute 是代碼訪問安全屬性。該屬性使 JIT 編譯器檢查鏈接到 WelcomeLabel 的代碼是否具有 AspNetHostingPermission 權限。所有的公共 ASP.NET 類均使用此屬性標記。應將 AspNetHostingPermissionAttribute 應用於控件,以對部分受信任的被調用方進行安全檢查。

  • DefaultPropertyAttribute 是設計時屬性 (Attribute),它指定控件的默認屬性 (Property)。在可視化設計器中,當頁開發人員在設計圖面上單擊控件時,屬性瀏覽器通常突出顯示此默認屬性。

  • ToolboxDataAttribute 指定元素的格式字符串。如果在工具箱中雙擊控件或將其從工具箱拖動到設計圖面上時,該字符串將成爲控件的標記。對於 WelcomeLabel,該字符串創建此元素:

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

WelcomeLabel 控件還從 WebControl 基類繼承了兩個屬性:ParseChildrenAttributePersistChildrenAttribute。它們被應用爲 ParseChildren(true)PersistChildren(false)。這兩個屬性 (Attribute) 一起與 ToolboxDataAttribute 屬性 (Attribute) 共同使用,這樣可將子元素解釋爲屬性 (Property),並將屬性 (Property) 作爲屬性 (Attribute) 保留。

以下應用於 WelcomeLabelText 屬性 (Property) 的屬性 (Attribute) 是標準設計時屬性 (Attribute),通常會將標準設計時屬性 (Attribute) 應用於控件的所有公共屬性 (Property):

  • BindableAttribute(被指定爲 truefalse),指定將屬性綁定到數據對可視化設計器是否有意義。例如,在 Visual Studio 2005 中,如果屬性標記爲 Bindable(true),則該屬性可顯示在“數據綁定”對話框中。如果屬性 (Property) 沒有使用此屬性 (Attribute) 標記,則屬性 (Property) 瀏覽器會推斷其值爲 Bindable(false)

  • CategoryAttribute 指定如何在可視化設計器的屬性瀏覽器中對屬性進行分類。例如,當頁開發人員使用屬性瀏覽器的分類視圖時,Category("Appearance") 將告知屬性瀏覽器在“外觀”類別中顯示屬性。可以根據屬性瀏覽器中的現有類別指定字符串參數,也可以創建自己的類別。

  • DescriptionAttribute 指定屬性的簡短描述。在 Visual Studio 2005 中,屬性瀏覽器將在“屬性”窗口底部顯示選定的屬性的描述。

  • DefaultValueAttribute 指定屬性的默認值。此值應與從屬性訪問器 (getter) 返回的默認值相同。在 Visual Studio 2005 中,DefaultValueAttribute 允許頁開發人員通過在“屬性”窗口中喚出快捷菜單然後單擊“重置”按鈕將屬性值重置爲其默認值。

  • LocalizableAttribute(指定爲 truefalse)指定本地化屬性對可視化設計器是否有意義。當某屬性標記爲 Localizable(true) 時,可視化設計器會在對本地化資源進行序列化時包含該屬性。對控件輪詢可本地化的屬性時,設計器會將此屬性值保存到非特定於區域性的資源文件或其他本地化源中。

    Note注意

    由於 ASP.NET 1.0 版和 1.1 版中的 ASP.NET 本地化模型不同,因此在這些版本中不能將 LocalizableAttribute 應用於自定義服務器控件。

應用於控件及其成員的設計時屬性在運行時不會影響控件的功能,但在可視化設計器中使用控件時,這些屬性能提升開發人員的體驗。有關服務器控件的設計時、分析時和運行時屬性的完整列表,可參見自定義服務器控件的元數據屬性

可以使用 ASP.NET 動態編譯功能對頁中的控件進行測試,而無需將控件編譯爲程序集。ASP.NET 能動態編譯 ASP.NET 網站根目錄下 App_Code 目錄中放置的代碼。這樣就可以從頁訪問 App_Code 中源文件中的類,而無需將其手動編譯爲程序集。如果將控件的源文件放入了 App_Code 目錄,則對控件的代碼所做的更改能立即在使用這些控件的頁中反映出來。

Note注意

App_Code 目錄是 ASP.NET 1.0 和 1.1 中都沒有的新功能。使用 App_Code 目錄進行初始控件測試是一個可選步驟。生成服務器控件的主要步驟與早期版本相同,下一節“將控件編譯爲程序集”將對此進行介紹。

創建 ASP.NET 網站和 App_Code 目錄

  1. 創建一個名爲 ServerControlsTest 的網站。可以在 IIS 中將該站點創建爲名爲 ServerControlsTest 的虛擬目錄。有關創建和配置 IIS 虛擬目錄的詳細信息,請參見如何:在 IIS 中創建和配置虛擬目錄

  2. 直接在網站根目錄(也稱 Web 應用程序根目錄)下創建一個 App_Code 目錄。

  3. 將控件的源文件(WelcomeLabel.cs 或 WelcomeLabel.vb)複製到 App_Code 目錄。

創建標記前綴

標記前綴是指在頁中以聲明方式創建控件時出現在控件類型名稱前面的前綴,如 <asp:Table /> 中的“asp”。若要在頁中以聲明方式使用您的控件,則 ASP.NET 需要一個映射到該控件的命名空間的標記前綴。通過在每個使用自定義控件的頁上添加一個 @ Register 指令,頁開發人員可提供標記前綴/命名空間映射,如下面的示例所示:

<%@ Register TagPrefix="aspSample" 
        Namespace="Samples.AspNet.CS.Controls"%>

[Visual Basic]

<%@ Register TagPrefix="aspSample" 
        Namespace="Samples.AspNet.VB.Controls"%>
Note注意

ASP.NET 2.0 中的 @ Register 指令與 ASP.NET 1.0 和 ASP.NET 1.1 中的相同。如果您熟悉 ASP.NET 早期版本中的 Register 指令,您會注意到前面的 Register 指令中缺少指定控件程序集名稱的 assembly 屬性。如果缺少 assembly 屬性,則 ASP.NET 會推斷該程序集是從 App_Code 目錄中的源文件動態編譯而來。

除了在每個 .aspx 頁中使用 @ Register 指令,頁開發人員還可以在 Web.config 文件中指定標記前綴/命名空間映射。如果將在 Web 應用程序的多個頁中使用自定義控件,則該方法非常有用。下面的過程描述如何在 Web.config 文件中指定標記前綴映射。

在 Web.config 文件中添加標記前綴映射

  1. 如果不存在名爲 Web.config 的文本文件,則請在網站的根目錄下創建該文件。

  2. 創建了新的(空的)Web.config 文件之後,將以下代碼複製到該文件中並保存該文件。

    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"   
             namespace="Samples.AspNet.CS.Controls">
           </add>
         </controls>
       </pages>
      </system.web>
    </configuration>

     

    Visual Basic
    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"   
             namespace="Samples.AspNet.VB.Controls">
           </add>
         </controls>
       </pages>
      </system.web>
    </configuration>

    突出顯示部分是一個標記前綴項,該項將標記前綴“aspSample”映射到命名空間 Samples.AspNet.CS.ControlsSamples.AspNet.VB.Controls

  3. 如果已存在一個 Web.config 文件,則請將前一步驟中突出顯示的文本作爲該配置文件的 controls 元素的子項添加到該文件中。如果 Web.config 文件中沒有 controlspages 元素,則請按照前一步驟中介紹的方法創建這些元素。

    Note注意

    標記前綴項必須是 controls 節的子項,而該節必須位於 pages 節下,而後者又必須是 system.web 的子項。

在配置文件中指定了標記前綴映射之後,可以在網站的任何頁中以聲明方式使用 WelcomeLabel 控件(如 <aspSample:WelcomeLabel />)。

Note注意

標記前綴的配置項是 ASP.NET 2.0 的新功能。在 ASP.NET 1.0 和 1.1 中,標記前綴映射在每個使用自定義控件的頁的 @ Register 指令中指定。

創建使用控件的頁

創建使用自定義控件的頁

  1. 在網站中創建一個名爲 WelcomeLabelTest.aspx 的文本文件。

  2. 將以下標記複製到 WelcomeLabelTest.aspx 文件中並保存該文件。

    Visual Basic
    <%@ Page Language="VB"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html  >
      <head id="Head1" runat="server">
        <title>WelcomeLabel Test</title>
      </head>
      <body>
        <form id="form1" runat="server">
          <div>
            <aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1" 
              runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
          </div>
        </form>
      </body>
    </html>
    
    <%@ Page Language="C#"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html  >
      <head id="Head1" runat="server">
        <title>WelcomeLabel Test</title>
      </head>
      <body>
        <form id="form1" runat="server">
          <div>
            <aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1" 
              runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
          </div>
        </form>
      </body>
    </html>
    
  3. 在地址欄中輸入以下 URL,以在瀏覽器中顯示 WelcomeLabelTest.aspx:

    http://localhost/ServerControlsTest/WelcomeLabelTest.aspx
  4. 對控件的源代碼做一些更改。例如,通過在 RenderContents 方法末尾處添加此行代碼來多寫一個字符串:

    writer.Write("Testing how the App_Code directory works.");
    

     

    Visual Basic
    writer.Write("Testing how the App_Code directory works.")
    
  5. 在瀏覽器中刷新 WelcomeLabelTest.aspx 頁。

    將看到,儘管沒有編譯控件,對控件所做的更改仍在頁中反映出來了。

除了顯式定義的 WelcomeLabel 控件的 Text 屬性之外,從頁中的控件實例可以看到,它還具有之前並沒有定義的 BackColorForeColor 屬性。WelcomeLabel 控件通過從 WebControl 基類繼承,從而獲取與樣式相關的這些屬性和其他屬性。此外,WelcomeLabel 可自行分配外觀併成爲主題的一部分。

儘管利用 App_Code 目錄可以不編譯就對控件進行測試,但是如果您希望將您的控件作爲對象代碼分發給其他開發人員,則必須對其進行編譯。此外,如果沒有將控件編譯爲程序集,就不能將該控件添加到可視化設計器的工具箱中。

將控件編譯爲程序集

  1. 按照以下這些步驟設置計算機的 Windows 環境 PATH 變量,使其包含 .NET Framework 的安裝路徑:

    1. 在 Windows 中,右擊“我的電腦”,選擇“屬性”,單擊“高級”選項卡,然後單擊“環境變量”按鈕。

    2. 在“系統變量”列表中,雙擊 Path 變量。

    3. 在“變量值”文本框中,將一個分號 (;) 添加到文本框中的現有值的末尾,然後鍵入 .NET Framework 的安裝路徑。.NET Framework 通常安裝在位於 /Microsoft.NET/Framework/版本號 的 Windows 安裝目錄中。

    4. 單擊“確定”關閉每個對話框。

  2. 從爲本演練第一步中的源文件創建的目錄中運行以下命令。

    Note注意

    這與複製控件源文件以進行測試的 App_Code 目錄不同。

    csc /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs
    

     

    Visual Basic
    vbc /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll /r:System.Web.dll *.vb
    

    /t:library 編譯器選項告知編譯器創建一個庫,而不是創建一個可執行程序集。/out 選項爲程序集提供名稱,而 /r 選項則列出鏈接到您的程序集的那些程序集。

爲保持示例獨立,本演練要求創建具有單個控件的程序集。通常,.NET Framework 設計指導原則建議不要創建只包含很少的類的程序集。爲了便於部署,應儘可能少地創建程序集。

在控件程序集中嵌入圖標

可視化設計器(如 Visual Studio 2005)通常使用默認圖標(如齒輪圖像)顯示工具箱中的控件。作爲控件的一個選項,可以通過在控件的程序集中嵌入一個 16*16 像素的位圖來自定義控件在工具箱中的外觀。根據約定,可視化設計器將該位圖最下方左側的像素用作透明色。

在控件程序集中嵌入圖標

  1. 創建或獲取一個 16*16 像素的位圖,將其作爲控件的工具箱圖標。

  2. 將該位圖命名爲 WelcomeLabel.bmp。

  3. 將該位圖文件添加到包含 WelcomeLabel 控件源文件的目錄(CustomControlsCS 或 CustomControlsVB)中。

  4. 從包含源文件的目錄中運行以下命令:

    csc /res:WelcomeLabel.bmp,Samples.AspNet.CS.Controls.WelcomeLabel.bmp 
    /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll 
    /r:System.Web.dll *.cs
    

     

    Visual Basic
    vbc /res:WelcomeLabel.bmp,Samples.AspNet.VB.Controls.WelcomeLabel.bmp 
    /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll 
    /r:System.Web.dll *.vb
    

    此命令將編譯控件並將該位圖作爲資源嵌入到程序集中。嵌入的位圖資源的名稱必須與關聯控件的命名空間限定名稱完全相同。例如,如果控件名稱爲 Samples.AspNet.CS.Controls.WelcomeLabel,則嵌入的位圖的名稱必須爲 Samples.AspNet.CS.Controls.WelcomeLabel.bmp。此命名約定使可視化設計器能自動將該位圖用作控件的工具箱圖標。如果不使用此命名約定,則必須將 ToolboxBitmapAttribute 應用於該控件,以指定嵌入的位圖資源的名稱。

使用 TagPrefixAttribute 提供標記前綴/命名空間映射

在本演練前面的內容中,在介紹使用 App_Code 目錄時講述了頁開發人員如何在頁或 Web.config 文件中指定標記前綴。可以選擇通過包含程序集級別的 System.Web.UI.TagPrefixAttribute 屬性,建議可視化設計器應爲控件使用的默認標記前綴。如果設計器未找到在 Web.config 文件或頁中的 Register 指令中映射的標記前綴,TagPrefixAttribute 屬性就會爲可視化設計器提供可以使用的標記前綴,因此該屬性非常有用。在工具箱中首次雙擊控件或將其從工具箱拖動到頁中時,此標記前綴將向頁進行註冊。

如果決定使用 TagPrefixAttribute 屬性,則可以在與控件一起編譯的單獨文件中指定該屬性。根據約定,該文件名爲 AssemblyInfo.語言擴展,如 AssemblyInfo.cs 或 AssembyInfo.vb。下面的過程介紹如何指定 TagPrefixAttribute 元數據。

Note注意

如果沒有在控件的程序集中指定 TagPrefixAttribute,並且頁開發人員沒有在頁或 Web.config 文件中指定標記前綴/命名空間映射,則可視化設計器將創建一個默認的標記前綴。例如,從工具箱中拖動控件時,Visual Studio 2005 將創建其自己的控件標記,如 cc1

使用 TagPrefixAttribute 添加命名空間/標記前綴映射

  1. 在源代碼目錄中創建一個名爲 AssemblyInfo.cs 或 AssemblyInfo.vb 的文件並向該文件添加以下代碼。

    using System;
    using System.Web.UI;
    [assembly: TagPrefix("Samples.AspNet.CS.Controls", "aspSample")]
    

     

    Visual Basic
    Imports System
    Imports System.Web.UI
    <Assembly: TagPrefix("Samples.AspNet.VB.Controls", "aspSample")> 
    

    標記前綴屬性在命名空間 Samples.AspNet.CS.ControlsSamples.AspNet.VB.Controls 與前綴 aspSample 之間創建映射。

  2. 使用前面使用的編譯命令重新編譯所有的源文件(使用或不使用嵌入資源)。

若要測試自定義控件的已編譯版本,則必須使網站中的頁可以訪問此控件的程序集。

使網站可以訪問控件的程序集

  1. 在網站的根目錄下創建一個 Bin 目錄。

  2. 將控件程序集(Samples.AspNet.CS.Controls.dll 或 Samples.AspNet.VB.Controls.dll)複製到 Bin 目錄。

  3. 從 App_Code 目錄中刪除該控件的源文件。

    如果沒有刪除源文件,則您的控件的類型將同時存在於編譯的程序集中和由 ASP.NET 動態生成的程序集中。這在加載該控件時會造成不明確引用,加載任何使用該控件的頁時將生成編譯器錯誤。

本演練中創建的程序集必須放在 ASP.NET 網站的 Bin 目錄中才能使網站中的頁使用您的控件,故而該程序集爲私有程序集。如果其他應用程序沒有安裝該程序集的副本,則這些應用程序都不能訪問該程序集。如果要爲共享的 Web 宿主應用程序創建控件,通常會將控件打包到一個私有程序集中。但是,如果要創建在專用宿主環境中使用的控件,或要創建 ISP 向所有客戶提供的一系列控件,則需要將您的控件打包到安裝在全局程序集緩存中的一個共享(強名稱)程序集中。有關更多信息,請參見使用程序集和全局程序集緩存

接下來,必須修改在 Web.config 中創建的標記前綴映射,以指定控件的程序集名稱。

修改 Web.config 中的標記前綴映射

  • 編輯 Web.config 文件,向 add tagPrefix 元素添加 assembly 屬性:

    <controls>
      <add tagPrefix="aspSample"   
        namespace="Samples.AspNet.CS.Controls" 
        assembly="Samples.AspNet.CS.Controls">
      </add>
    </controls>

     

    Visual Basic
    <controls>
      <add tagPrefix="aspSample"   
        namespace="Samples.AspNet.VB.Controls" 
        assembly="Samples.AspNet.VB.Controls">
      </add>
    </controls>

assembly 屬性指定控件所在的程序集的名稱。add tagPrefix 元素將標記前綴映射到命名空間和程序集的組合。ASP.NET 從 App_Code 目錄中的源文件動態生成程序集時,無需提供程序集屬性。未使用程序集屬性時,ASP.NET 會從通過 App_Code 目錄動態生成的程序集加載控件的類型。

查看使用自定義控件的頁

  • 通過在地址欄中輸入以下 URL,可在瀏覽器中顯示 WelcomeLabelTest.aspx 頁:

    http://localhost/ServerControlsTest/WelcomeLabelTest.aspx

如果在可視化設計器(如 Visual Studio 2005)中使用您的控件,可以向工具箱添加您的控件,可以將其從工具箱拖動到設計圖面,還可以在屬性瀏覽器中訪問其屬性和事件。此外,在 Visual Studio 2005 中,您的控件在頁設計器的“源”視圖和代碼編輯器中具有完整的 IntelliSense 支持。這包括 script 塊中的語句結束支持以及頁開發人員單擊控件標記時的屬性瀏覽器支持。

Note注意

在許多可視化設計器中,可以將自定義控件添加到設計器的工具箱中。有關詳細信息,請參閱設計器文檔。

本演練演示瞭如何開發簡單的自定義 ASP.NET 服務器控件以及如何在頁中使用該控件。您瞭解瞭如何定義屬性以及如何將控件編譯爲程序集。有關更多信息,包括有關呈現、定義屬性、維護狀態和實現複合控件的信息,請參見開發自定義 ASP.NET 服務器控件

在本演練中,您瞭解了可以爲您的控件提供自定義工具箱圖標。您還學習瞭如何添加設計時元數據,從而爲您的控件自定義屬性瀏覽器支持。通過使用在設計時和運行時提供不同用戶界面的可視化設計器類,複雜控件(如 GridView 控件)進一步增強了其設計時體驗。ASP.NET 2.0 爲服務器控件提供的設計器對象模型與 ASP.NET 1.0 和 1.1 中提供的模型大爲不同。若要了解有關在 ASP.NET 2.0 中爲您的控件實現自定義設計器類的信息,請參見 ASP.NET 控件設計器概述

在 ASP.NET 2.0 中,服務器控件通過使用適配器類可以爲客戶端瀏覽器或設備定義不同行爲。有關更多信息,請參見開發 ASP.NET 服務器控件的適配器

不同的瀏覽器和相同瀏覽器的不同版本支持不同的功能。ASP.NET 服務器控件將自動確定已請求 .aspx 頁的瀏覽器,併爲該瀏覽器正確設置所生成的 HTML 標記的格式。但是,部分控件功能無法在較低版本的瀏覽器上呈現,因此需要在儘可能多的瀏覽器類型上查看頁的輸出,以確保頁以預期方式呈現在所有瀏覽器中。有關更多信息,請參見 ASP.NET Web 服務器控件和瀏覽器功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章