創(chuàng)作簡(jiǎn)單的 ASP.NET 服務(wù)器控件
1. 定義一個(gè)直接或間接從 System.Web.UI.Control 派生的類(lèi)。
2. [C#]
3.using System;
4.using System.Web.UI;
5.public class FirstControl : Control{...}
using 指令允許代碼從名稱(chēng)空間引用類(lèi)型,而無(wú)須使用完全限定名。因此,Control 解析為 System.Web.UI.Control。
6. 將控件包含在名稱(chēng)空間中。可以定義新的名稱(chēng)空間或者使用現(xiàn)有的名稱(chēng)空間。名稱(chēng)空間的名稱(chēng)是 Register 頁(yè)指令中名稱(chēng)空間偽特性的值。(例如,<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>)。有關(guān)在 ASP.NET 頁(yè)上使用自定義控件的示例,請(qǐng)參見(jiàn)本主題末尾的示例。
7. [C#]
8.namespace CustomControls
9.{
10. public class FirstControl : Control {...}
11. ...
12. }
13. 定義控件所需的屬性。以下代碼片段定義了一個(gè)名為 Message 的屬性。屬性類(lèi)似于智能字段,它們擁有訪(fǎng)問(wèn)器方法。
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. }
有關(guān)屬性的更多信息,請(qǐng)參見(jiàn)屬性概述。若要定義在往返過(guò)程中維護(hù)其狀態(tài)的屬性,請(qǐng)參見(jiàn)維護(hù)控件中的狀態(tài)。
25. 重寫(xiě)控件從 Control 繼承的 Render 方法。此方法提供將 HTML 發(fā)送到客戶(hù)端瀏覽器的邏輯。控件發(fā)送到客戶(hù)端的 HTML 是作為字符串參數(shù)傳遞給 System.Web.UI.HtmlTextWriter 實(shí)例的 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. }
在該代碼片段中訪(fǎng)問(wèn)的 System.DateTime 類(lèi)是一個(gè)實(shí)用工具類(lèi),它可提供日期和時(shí)間信息。請(qǐng)注意,該類(lèi)是在服務(wù)器上調(diào)用的,因此返回服務(wù)器上的時(shí)間。
在此代碼片段中,原始 HTML 僅作為字符串參數(shù)傳遞給 HtmlTextWriter 的 Write 方法。有關(guān)使用 HtmlTextWriter 方法簡(jiǎn)化 HTML 呈現(xiàn)以及呈現(xiàn)從 WebControl 派生的控件的詳細(xì)信息,請(qǐng)參見(jiàn)呈現(xiàn) ASP.NET 服務(wù)器控件。
為簡(jiǎn)單起見(jiàn),在本例中,FirstControl 是從 Control 派生的。如果您要?jiǎng)?chuàng)作自行呈現(xiàn)的組件,請(qǐng)從 System.Web.UI.WebControls.WebControl 中派生,以便控件可以繼承 UI 特定的屬性。
34. 根據(jù)需要添加運(yùn)行時(shí)和設(shè)計(jì)時(shí)特性,以便為控件提供自定義元數(shù)據(jù)。運(yùn)行時(shí)特性是某些控件必需的。需要運(yùn)行時(shí)特性的控件示例有:公開(kāi)模板的控件、執(zhí)行數(shù)據(jù)綁定的控件或者需要自定義分析邏輯的控件。有關(guān)運(yùn)行時(shí)特性的示例,請(qǐng)參見(jiàn)開(kāi)發(fā)模板化控件。如果要在可視化設(shè)計(jì)器(如 Visual Studio .NET)中使用控件,則需要設(shè)計(jì)時(shí)屬性。設(shè)計(jì)時(shí)屬性不是公共語(yǔ)言運(yùn)行庫(kù)所必需的,但這些屬性提供在設(shè)計(jì)時(shí)顯示一個(gè)控件所必需的元數(shù)據(jù)。下面的代碼片段將設(shè)計(jì)時(shí)特性應(yīng)用到第 2 步中定義的 Message 屬性上。
35. [C#]
36. [Description("A message string to display to the user")]
37. public virtual String Message{...}
有關(guān)設(shè)計(jì)時(shí)特性的更多信息,請(qǐng)參見(jiàn)組件的設(shè)計(jì)時(shí)特性和屬性與設(shè)計(jì)時(shí)支持。
38. 通過(guò)執(zhí)行以下步驟來(lái)保存、編譯和部署控件。
a. 在應(yīng)用程序的根目錄中創(chuàng)建名為 /bin 的子目錄。
b. 將源文件編譯為程序集 (.dll),并將該程序集保存到應(yīng)用程序的 /bin 子目錄中。
例如,如果源代碼是用 C# 編寫(xiě)的,并且保存為名為 FirstControl.cs 的文件,則可以從包含源文件的目錄執(zhí)行以下命令。
csc /t[arget]:library /out:[path to bin]bin\CustomControls.dll /r[eference]:System.Web.dll /r:System.dll FirstControl.cs
/r 選項(xiàng)通知編譯器控件引用了哪些程序集。
控件現(xiàn)已編譯完成,可以隨時(shí)在應(yīng)用程序的根目錄(或者其任何子目錄)下的任何 ASP.NET 頁(yè)中使用該控件。
下面是 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 頁(yè)上使用 FirstControl
以下 ASP.NET 頁(yè)使用上一例中創(chuàng)建的自定義控件。Register 頁(yè)指令允許頁(yè)開(kāi)發(fā)人員給名稱(chēng)空間創(chuàng)建別名,并為 ASP.NET 提供包含該控件的程序集的名稱(chēng)。本例為 CustomControls 名稱(chēng)空間創(chuàng)建別名 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>