共用方式為


開發簡單 ASP.NET 伺服器控制項

這個主題逐步為您解說撰寫簡單自訂伺服器控制項 (具有一個屬性,並且不會引發或處理事件) 的步驟。

若要撰寫簡單 ASP.NET 伺服器控制項

  1. 定義直接或間接衍生自 System.Web.UI.Control 的類別。

    using System;
    using System.Web.UI;
    public class FirstControl : Control{...}
    [Visual Basic]
    Imports System
    Imports System.Web.UI
    Public Class FirstControl   Inherits Control
    End Class
    

    using 指示詞允許程式碼不需使用完整名稱而參考命名空間(Namespace) 中的型別。因此 Control 會解析至 System.Web.UI.Control

  2. 將您的控制項封入命名空間。您可以定義新的命名空間或使用現有的命名空間。命名空間名稱是 Register 網頁指示詞中命名空間虛擬屬性的值。(例如,<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>)。如需在 ASP.NET 網頁上使用自訂控制項的範例,請參閱這個主題結尾的範例。

    namespace CustomControls
    {
          public class FirstControl : Control {...}
    ...
    }
    [Visual Basic]
    Namespace CustomControls
       Public Class FirstControl
          Inherits Control
          ...
       End Class
    End Namespace
    
  3. 定義您控制項所需的屬性。下列程式片段定義名為 Message 的屬性。屬性像智慧型欄位,並且具有存取子方法。

    private String message = "Hello";
    //The Message property.
          public virtual String Message{
                get{
                      return message;
                }
                set{
                      message = value;
                }
          }
    [Visual Basic]
    Private _message As String = "Hello"
    Public Overridable Property Message() As String
       Get
          Return _message
       End Get
       Set
          _message = value
       End Set
    End Property
    

    如需屬性的詳細資訊,請參閱屬性概觀。若要定義會跨數趟往返來維護其狀態的屬性,請參閱維護控制項的狀態

  4. 覆寫您控制項繼承自 ControlRender 方法。這個方法提供傳送 HTML 至用戶端瀏覽器的邏輯。您控制項傳送至用戶端的 HTML 將被當作字串引數傳遞至 System.Web.UI.HtmlTextWriter 執行個體 (Instance) 的 Write 方法,如下列範例所示。

    protected override void Render( HtmlTextWriter writer)
                {
                writer.Write("<font> "+ this.Message + "<br>" +
                            "The date and time on the server: " +      
                             System.DateTime.Now.ToLongTimeString()
                             + "</font>");
                }
    [Visual Basic]
    Protected Overrides Sub Render(writer As HtmlTextWriter)
       writer.Write(("<font> " & Me.Message & "<br>" & _
          "The time on the server is " & _
          System.DateTime.Now.ToLongTimeString() & _
          "</font>"))
    End Sub
    

    這個程式碼片段中存取的類別 System.DateTime 為公用 (Public) 程式類別,提供日期和時間資訊。注意,這個類別在伺服器上被叫用 (Invoke),因而會傳回伺服器上的時間。

    程式碼片段中,未經處理的 HTML 只是當作字串引數傳遞至 HtmlTextWriterWrite 方法。如需使用 HtmlTextWriter 方法來簡化 HTML 呈現和呈現衍生自 WebControl 的控制項的詳細資訊,請參閱呈現 ASP.NET 伺服器控制項

    為簡單起見,在這個範例中 FirstControl 衍生自 Control。如果您正在撰寫處理它自己的呈現的控制項,請從 System.Web.UI.WebControls.WebControl 來衍生,以便您的控制項可以繼承 UI 特定屬性**。**

  5. 加入 Run-Time 和設計階段屬性,按照需要提供自訂中繼資料 (Metadata) 給您的控制項。Run-Time 屬性為某些控制項所必要的。需要 Run-Time 屬性的控制項範例有那些公開樣板、執行資料繫結或需要自訂剖析邏輯的控制項。如需 Run-Time 屬性的範例,請參閱開發樣板化的控制項。如果在視覺化設計工具 (例如 Visual Studio .NET) 中會用到您的控制項,就需要設計階段屬性。Common Language Runtime 不需要設計階段屬性,不過必須要有這些屬性提供的中繼資料,才能在設計階段顯示控制項。下面程式碼片段套用設計階段屬性於步驟 2 中定義的 Message 屬性。

    [Description("A message string to display to the user")]
    public virtual String Message{...}
    [Visual Basic]
    <Description("A message string to display to the user")> _
    Public Overridable Property Message() As String
       ...
    End Property
    

    如需設計階段屬性的詳細資訊,請參閱元件的設計階段屬性屬性和設計階段支援

  6. 藉由執行下列步驟來儲存、編譯和部署控制項。

    1. 在您應用程式的根目錄中建立名為 /bin 的子目錄。
    2. 將原始程式檔 (Source File) 編譯成組件 (.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 選項通知編譯器 (Compiler),哪些組件要被您的控制項參考。

    您的控制項現已編譯,並且可隨時從您應用程式根目錄 (或其任何子目錄) 中的任何 ASP.NET 網頁來使用。

FirstControl 的完整程式碼如下。控制項被封入在命名空間 CustomControls 中。

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>");
                  
            }
      
      }
}
[Visual Basic]
Option Explicit
Option Strict

Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace CustomControls
   Public Class FirstControl
      Inherits Control
      Private _message As String = "Hello"
      
      Public Overridable Property Message() As String
         Get
            Return _message
         End Get
         Set
            _message = value
         End Set
      End Property
      
      Protected Overrides Sub Render(writer As HtmlTextWriter)
         writer.Write(("<font> " + Me.Message + "<br>" + "The time on the server is " + System.DateTime.Now.ToLongTimeString() + "</font>"))
      End Sub
   End Class
End Namespace

在 ASP.NET 網頁上使用 FirstControl

下列 ASP.NET 網頁使用前面範例中建立的自訂控制項。Register 網頁指示詞允許網頁開發人員建立命名空間的別名 (Alias),並且也提供含有控制項的組件的名稱給 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>

請參閱

ASP.NET 伺服器控制項中的屬性 | ASP.NET 伺服器控制項中的事件