創作簡單的 ASP.NET 服務器控件

參見: http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconwalkthroughdevelopingsimplewebformscontrol.asp

1.  定義一個直接或間接從 System.Web.UI.Control 派生的類。

2.  [C#]

3.using System;

4.using System.Web.UI;

5.public class FirstControl : Control{...}

using 指令允許代碼從名稱空間引用類型,而無須使用完全限定名。因此,Control 解析為 System.Web.UI.Control。

6.  將控件包含在名稱空間中。可以定義新的名稱空間或者使用現有的名稱空間。名稱空間的名稱是 Register 頁指令中名稱空間偽特性的值。(例如,<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>)。有關在 ASP.NET 頁上使用自定義控件的示例,請參見本主題末尾的示例。

7.  [C#]

8.namespace CustomControls

9.{

10.                     public class FirstControl : Control {...}

11.               ...

12.               }

13.  定義控件所需的屬性。以下代碼片段定義了一個名為 Message 的屬性。屬性類似于智能字段,它們擁有訪問器方法。

14.                [C#]

15.               private String message = "Hello";

16.               //The Message property.

17.                     public virtual String Message{

18.                           get{

19.                                 return message;

20.                           }

21.                           set{

22.                                 message = value;

23.                           }

24.                     }

有關屬性的更多信息,請參見屬性概述。若要定義在往返過程中維護其狀態的屬性,請參見維護控件中的狀態

25.  重寫控件從 Control 繼承的 Render 方法。此方法提供將 HTML 發送到客戶端瀏覽器的邏輯。控件發送到客戶端的 HTML 是作為字符串參數傳遞給 System.Web.UI.HtmlTextWriter 實例的 Write 方法的,如下面的示例所示。

26.                [C#]

27.               protected override void Render( HtmlTextWriter writer)

28.                           {

29.                           writer.Write("<font> "+ this.Message + "<br>" +

30.                                       "The date and time on the server: " +     

31.                                        System.DateTime.Now.ToLongTimeString()

32.                                        + "</font>");

33.                           }

在該代碼片段中訪問的 System.DateTime 類是一個實用工具類,它可提供日期和時間信息。請注意,該類是在服務器上調用的,因此返回服務器上的時間。

在此代碼片段中,原始 HTML 僅作為字符串參數傳遞給 HtmlTextWriter Write 方法。有關使用 HtmlTextWriter 方法簡化 HTML 呈現以及呈現從 WebControl 派生的控件的詳細信息,請參見呈現 ASP.NET 服務器控件。

為簡單起見,在本例中,FirstControl 是從 Control 派生的。如果您要創作自行呈現的組件,請從 System.Web.UI.WebControls.WebControl 中派生,以便控件可以繼承 UI 特定的屬性。

34.  根據需要添加運行時和設計時特性,以便為控件提供自定義元數據。運行時特性是某些控件必需的。需要運行時特性的控件示例有:公開模板的控件、執行數據綁定的控件或者需要自定義分析邏輯的控件。有關運行時特性的示例,請參見開發模板化控件。如果要在可視化設計器(如 Visual Studio .NET)中使用控件,則需要設計時屬性。設計時屬性不是公共語言運行庫所必需的,但這些屬性提供在設計時顯示一個控件所必需的元數據。下面的代碼片段將設計時特性應用到第 2 步中定義的 Message 屬性上。

35.                [C#]

36.               [Description("A message string to display to the user")]

37.               public virtual String Message{...}

有關設計時特性的更多信息,請參見組件的設計時特性屬性與設計時支持。

38.  通過執行以下步驟來保存、編譯和部署控件。

a.                      在應用程序的根目錄中創建名為 /bin 的子目錄。

b.                      將源文件編譯為程序集 (.dll),并將該程序集保存到應用程序的 /bin 子目錄中。

例如,如果源代碼是用 C# 編寫的,并且保存為名為 FirstControl.cs 的文件,則可以從包含源文件的目錄執行以下命令。

csc /t[arget]:library /out:[path to bin]bin\CustomControls.dll /r[eference]:System.Web.dll /r:System.dll FirstControl.cs

/r 選項通知編譯器控件引用了哪些程序集。

控件現已編譯完成,可以隨時在應用程序的根目錄(或者其任何子目錄)下的任何 ASP.NET 頁中使用該控件。

下面是 FirstControl 的完整代碼。該控件包含在命名空間 CustomControls 中。

[C#]

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace CustomControls

{

      public class FirstControl : Control

      {

            private String message = "Hello";

           

            public virtual String Message

            {

                  get

                  {

                        return message;

                  }

                  set

                  {

                        message = value;

                  }

            }

           

            protected override void Render( HtmlTextWriter writer)

            {

            writer.Write("<font> "

                        + this.Message + "<br>" + "The time on the server is " + System.DateTime.Now.ToLongTimeString()

                        + "</font>");

                 

            }

     

      }

}

ASP.NET 頁上使用 FirstControl

以下 ASP.NET 頁使用上一例中創建的自定義控件。Register 頁指令允許頁開發人員給名稱空間創建別名,并為 ASP.NET 提供包含該控件的程序集的名稱。本例為 CustomControls 名稱空間創建別名 Custom。

<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>

<html>

   <body>  

      <form  runat=server>         

          Here is a custom ASP.NET server control.<br><br>

          <Custom:FirstControl Message= "This control tells time. "  runat=server/>

       <br>                              

      </form>

   </body>

</html>