開發簡單 ASP.NET 伺服器控制項
這個主題逐步為您解說撰寫簡單自訂伺服器控制項 (具有一個屬性,並且不會引發或處理事件) 的步驟。
若要撰寫簡單 ASP.NET 伺服器控制項
定義直接或間接衍生自 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。
將您的控制項封入命名空間。您可以定義新的命名空間或使用現有的命名空間。命名空間名稱是 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
定義您控制項所需的屬性。下列程式片段定義名為
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
覆寫您控制項繼承自 Control 的 Render 方法。這個方法提供傳送 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 只是當作字串引數傳遞至 HtmlTextWriter 的 Write 方法。如需使用 HtmlTextWriter 方法來簡化 HTML 呈現和呈現衍生自 WebControl 的控制項的詳細資訊,請參閱呈現 ASP.NET 伺服器控制項。
為簡單起見,在這個範例中
FirstControl
衍生自 Control。如果您正在撰寫處理它自己的呈現的控制項,請從 System.Web.UI.WebControls.WebControl 來衍生,以便您的控制項可以繼承 UI 特定屬性**。**加入 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
藉由執行下列步驟來儲存、編譯和部署控制項。
- 在您應用程式的根目錄中建立名為 /bin 的子目錄。
- 將原始程式檔 (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>