創(chuàng)作簡單的 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. 將控件包含在名稱空間中。可以定義新的名稱空間或者使用現(xiàn)有的名稱空間。名稱空間的名稱是 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. }
有關屬性的更多信息,請參見屬性概述。若要定義在往返過程中維護其狀態(tài)的屬性,請參見維護控件中的狀態(tài)。
25. 重寫控件從 Control 繼承的 Render 方法。此方法提供將 HTML 發(fā)送到客戶端瀏覽器的邏輯。控件發(fā)送到客戶端的 HTML 是作為字符串參數(shù)傳遞給 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 僅作為字符串參數(shù)傳遞給 HtmlTextWriter 的 Write 方法。有關使用 HtmlTextWriter 方法簡化 HTML 呈現(xiàn)以及呈現(xiàn)從 WebControl 派生的控件的詳細信息,請參見呈現(xiàn) ASP.NET 服務器控件。
為簡單起見,在本例中,FirstControl 是從 Control 派生的。如果您要創(chuàng)作自行呈現(xiàn)的組件,請從 System.Web.UI.WebControls.WebControl 中派生,以便控件可以繼承 UI 特定的屬性。
34. 根據(jù)需要添加運行時和設計時特性,以便為控件提供自定義元數(shù)據(jù)。運行時特性是某些控件必需的。需要運行時特性的控件示例有:公開模板的控件、執(zhí)行數(shù)據(jù)綁定的控件或者需要自定義分析邏輯的控件。有關運行時特性的示例,請參見開發(fā)模板化控件。如果要在可視化設計器(如 Visual Studio .NET)中使用控件,則需要設計時屬性。設計時屬性不是公共語言運行庫所必需的,但這些屬性提供在設計時顯示一個控件所必需的元數(shù)據(jù)。下面的代碼片段將設計時特性應用到第 2 步中定義的 Message 屬性上。
35. [C#]
36. [Description("A message string to display to the user")]
37. public virtual String Message{...}
有關設計時特性的更多信息,請參見組件的設計時特性和屬性與設計時支持。
38. 通過執(zhí)行以下步驟來保存、編譯和部署控件。
a. 在應用程序的根目錄中創(chuàng)建名為 /bin 的子目錄。
b. 將源文件編譯為程序集 (.dll),并將該程序集保存到應用程序的 /bin 子目錄中。
例如,如果源代碼是用 C# 編寫的,并且保存為名為 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àn)已編譯完成,可以隨時在應用程序的根目錄(或者其任何子目錄)下的任何 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 頁使用上一例中創(chuàng)建的自定義控件。Register 頁指令允許頁開發(fā)人員給名稱空間創(chuàng)建別名,并為 ASP.NET 提供包含該控件的程序集的名稱。本例為 CustomControls 名稱空間創(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>