概述
<script type="text/javascript"></script> 在本月的專欄中,我將討論下列主題:
- 什麼是用戶控件?
- 什麼是自定義控件?
- 用戶控件和自定義控件進行基本的區別是什麼?
我還將介紹幾個涉及諸如狀態管理和自定義控件的呈現之類的自定義控件的高級主題。
什麼是用戶控件?
<script type="text/javascript"></script> 用戶控件是自定義的可重用的控件,並且使用 HTML 和 Web 服務器控件使用相同的技術。 它們提供了一個簡單的方法,進行分區和在 ASP.NET Web 應用程序中重複使用公共用戶界面。 它們使用同一個 Web 窗體編程的模型的 Web 窗體頁工作。 有關 Web 窗體編程模型的詳細信息,請訪問下面的 Microsoft Developer Network (MSDN) 網站:
http://msdn2.microsoft.com/en-us/library/65tcbxz3(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/65tcbxz3(vs.71).aspx)
Web 窗體代碼模型
http://msdn2.microsoft.com/en-us/library/015103yb(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/015103yb(vs.71).aspx)
如何創建用戶控件
<script type="text/javascript"></script> 用於創建用戶控件的語法與用於創建 Web 窗體頁 (.aspx) 的語法類似。 唯一的區別是用戶控件不包含在的 <html> <body>,和 <form> 元素,因爲在 Web 窗體頁承載用戶控件。 要創建用戶控件,請按下列步驟操作:
- 打開文本或 HTML 編輯器,並創建服務器端代碼塊公開所有屬性、 方法和事件。
<script language="C#" runat="server"> public void button1_Click(object sender, EventArgs e) { label1.Text = "Hello World!!!"; } </script>
- 創建用戶控件在用戶界面。
<asp:Label id="label1" runat="server"/> <br><br> <asp:button id="button1" text="Hit" OnClick="button1_Click" runat="server" />
如何在 Web 窗體頁中使用用戶控件
<script type="text/javascript"></script>
- 在 Microsoft Visual Studio.NET 2002、 Microsoft Visual Studio.NET 2003、 Microsoft Visual Studio 2005 或任何文本編輯器中創建新的 Web 窗體頁 (.aspx)。
- 聲明 @ Register 指令。 是例如使用下面的代碼。
<%@ Register TagPrefix="UC" TagName="TestControl" Src="test.ascx" %>
- Web 窗體頁中使用用戶控件,請 @ Register 指令後使用以下代碼。
<html> <body> <form runat="server"> <UC:TestControl id="Test1" runat="server"/> </form> </body> </html>
如何在代碼隱藏文件在 Web 窗體頁中的以編程方式創建用戶控件的實例
<script type="text/javascript"></script> 上一示例實例化用戶控件,Web 窗體頁使用 @ Register 指令中的聲明。 但是,您可以動態方式實例化用戶控件,並將它添加到頁。 下面是執行的步驟:
- 在 Visual Studio 中創建新的 Web 窗體頁。
- 定位到代碼隱藏文件生成爲此 Web 窗體頁。
- Page 類的 Page _ Load 事件中, 寫入以下 code.
// Load the control by calling LoadControl on the page class. Control c1 = LoadControl("test.ascx"); // Add the loaded control in the page controls collection. Page.Controls.Add(c1);
有關詳細信息,請訪問下面的網站:以編程方式向 Web 窗體頁添加控件
http://msdn2.microsoft.com/en-us/library/kyt0fzt1(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/kyt0fzt1(vs.71).aspx)
控件執行生命週期
http://msdn2.microsoft.com/en-us/library/aa719775(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/aa719775(vs.71).aspx)
動態的 Web 控件、 回發,和視圖狀態的 Scott Mitchell
http://aspnet.4guysfromrolla.com/articles/092904-1.aspx (http://aspnet.4guysfromrolla.com/articles/092904-1.aspx)
如何處理用戶控件
<script type="text/javascript"></script> 出現帶有用戶控件的頁面請求時, 以下情況:
- 頁面分析程序分析 @ Register 指令中 Src 屬性中指定的.ascx 文件,並生成從 System.Web.UI.UserControl 類派生的類。
- 解析程序然後動態編譯類爲程序集。
- 如果您使用 Visual Studio,然後在僅設計時,Visual Studio 創建一個代碼隱藏文件在用戶控件,並由本身設計預編譯該文件是。
- 最後,類爲用戶控件生成完成動態代碼生成和編譯的過程包括代碼隱藏文件代碼 (ascx.cs) 以及.ascx 文件中編寫的代碼。
什麼是自定義控件?
<script type="text/javascript"></script> 自定義控件是在服務器上執行,提供在對象模型的已編譯的代碼組件和將標記文本,如 HTML 或 XML,呈現爲普通的 Web 窗體或用戶控件不會。
如何選擇自定義控件的基類
<script type="text/javascript"></script> 若要寫入自定義控件則應直接或間接派生新類從 System.Web.UI.Control 類,或從 System.Web.UI.WebControls.WebControl 類:
- 如果您希望在控件呈現派生自非可視元素則應從 System.Web.UI.Control 中進行派生。 例如 <meta> <head> 是派生自非可視呈現的示例。
- 如果您希望以呈現生成一個 Visual 接口在客戶端計算機上的 HTML 控件則應從 System.Web.UI.WebControls.WebControl 中進行派生。
如果您想要更改如按鈕或標籤,之類的現有控件的功能您可以直接派生新類與這些現有的類,並可以更改其默認行爲。
簡要, Control 類提供了基本的功能,通過它您可以放置它 Page 類的控件樹中。 WebControl 類將功能添加到基本的 控件 類,用於在客戶端計算機上顯示 Visual 的內容。 是例如可以使用 WebControl 類控件的外觀和樣式屬性 (如字體、 顏色和高度。
如何創建和使用從 System.Web.UI.Control 擴展使用 Visual Studio 的簡單自定義控件
<script type="text/javascript"></script>
- 啓動 Visual Studio。
- 創建一個類庫項目然後賦予它一個的名稱是例如 CustomServerControlsLib。
- 將受源代碼文件添加到項目,是例如 SimpleServerControl.cs。
- System.Web 命名空間的引用納入參考部分中。
- 檢查是否將以下命名空間包括 SimpleServerControl.cs 文件
System System.Collections System.ComponentModel System.Data System.Web System.Web.SessionState System.Web.UI System.Web.UI.WebControls
- 繼承 控件 的基類 SimpleServerControls 類。
public class SimpleServerControl : Control
- 重寫 Render 方法將輸出寫入輸出流。
protected override void Render(HtmlTextWriter writer) { writer.Write("Hello World from custom control"); }
- 編譯類庫項目。 它將生成 DLL 輸出。
- 打開現有或創建新的 ASP.NET Web 應用程序項目。
- 添加一個 Web 窗體頁,可以在其中使用自定義的控件。
- ASP.NET 項目的參考部分中添加對該類庫的引用。
- 註冊 Web 窗體頁上自定義的控件。
<%@ Register TagPrefix="CC " Namespace=" CustomServerControlsLib " Assembly="CustomServerControlsLib " %>
- 要實例化,或使用 Web 窗體頁上自定義的控件,將代碼的下行添加在 <form> 標記中。
<form id="Form1" method="post" runat="server"> <CC:SimpleServerControl id="ctlSimpleControl" runat="server"> </CC:SimpleServerControl > </form>
- 運行在 Web 窗體頁,並您將會看到自定義控件輸出。
如果要不 Visual Studio 使用需要執行以下步驟:
- 打開任何文本編輯器。
- 創建一個名爲 SimpleServerControl.cs 的文件並編寫該的代碼,以指定在步驟 1 至 14。
- 在 PATH 變量中添加下面的路徑:
c:/windows (Winnt)/Microsoft.Net/Framework/v1.1.4322
- 打開一個命令提示符窗口,然後轉到存在 SimpleServerControl.cs 所在的位置。
- 運行以下命令:
csc /t:library / out: CustomServerControlsLib。 SimpleServerControl.dll /r:System.dll /r:System.Web.dll SimpleServerControl.cs有關 C# 編譯器 (csc.exe),請訪問下面的 MSDN 網站:http://msdn2.microsoft.com/en-us/library/1700bbwd(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/1700bbwd(vs.71).aspx)
- 若要運行 Web 窗體頁上自定義的控件,執行以下操作:
- 創建一個在 Wwwroot 文件夾下的目錄。
- 啓動 Microsoft Internet Information Services (IIS) 管理器,並在新目錄標記爲虛擬根目錄。
- 創建一個新的目錄下的 Bin 文件夾。
- 將自定義控件 DLL 複製到文件夾中。
- 將以前的步驟,在新的目錄中創建示例 Web 窗體頁。
- 運行示例頁通過 IIS 管理器。
既然您所生成簡單的自定義控件,讓我們來看一下如何公開屬性,並應用該自定義控件上的設計時屬性。
如何公開自定義控件上的屬性
<script type="text/javascript"></script>
我將基於上一個示例,並引入一個或多個屬性,可以使用 Web 窗體頁上自定義的控件時配置。
下面的示例顯示如何定義一個屬性,將顯示控件中的消息的時間,控件的屬性中指定特定數量:
- 在文本編輯器中打開 SimpleServerControl.cs。
- SimpleServerControl 類中添加屬性。
public class SimpleServerControl : Control { private int noOfTimes; public int NoOfTimes { get { return this.noOfTimes; } set { this.noOfTimes = value; } } protected override void Render (HtmlTextWriter writer) { for (int i=0; i< NoOfTimes; i++) { write.Write("Hello World.."+"<BR>"); } } }
- 編譯自定義控件。
- 若要使用 Web 窗體頁上的自定義控件,請向控件聲明中添加新的屬性。
<CC:SimpleServerControl id="ctlSimpleControl" NoOfTimes="5" runat="server"></CC:SimpleServerControl>
- 運行頁將顯示自定義控件中的"Hello World"條消息按控件的屬性中指定的次數。
如何應用自定義控件上的設計時屬性
<script type="text/javascript"></script>
爲什麼需要設計時屬性
<script type="text/javascript"></script>
您在前面的示例生成自定義控件正常工作。 但是,如果想要在 Visual Studio 中使用該控件,您可能需要在突出自動顯示在屬性窗口中在設計時選中自定義控件時, NoOfTimes 屬性。
要實現這一點,必須可以來執行此在稱爲屬性的 Visual Studio 中使用一項功能的 Visual Studio 提供元數據信息。 屬性可以定義類、 方法、 屬性或字段。 Visual Studio 加載自定義控件的類時, 它將檢查在類、 方法、 屬性或字段級定義的任何屬性,並相應地更改設計時時自定義控件的行爲。
若要了解有關屬性的詳細信息,請訪問下面的 MSDN 網站:
讓我們生成示例的使用常用屬性:
- 在文本編輯器中打開 SimpleServerControl.cs。
- 介紹一些基本屬性類級別是例如 DefaultProperty 、 ToolboxData 和 TagPrefixAttrbute 。 我們將我們的示例基於這三個屬性
[ // Specify the default property for the control. DefaultProperty("DefaultProperty"), // Specify the tag that is written to the aspx page when the // control is dragged from the Toolbox to the Design view. // However this tag is optional since the designer automatically // generates the default tag if it is not specified. ToolboxData("<{0}:ControlWithAttributes runat=/"server/">" + "</{0}:ControlWithAttributes>") ] public class ControlWithAttributes : Control { private string _defaultProperty; public string DefaultProperty { get { return "This is a default property value"; } set { this._defaultProperty = value; } } protected override void Render(HtmlTextWriter writer) { writer.Write("Default Property --> <B>" + DefaultProperty + "</B>"); } }
- 沒有名爲 TagPrefixAttrbute 的更多標記。 它是控件從工具箱拖動到設計器時,提供與標記前綴的程序集級屬性。 否則,設計器在默認情況下生成一個前綴,如"cc 1"。 TagPrefixAttrbute 不直接應用於控件類。 若應用 TagPrefixAttrbute ,請打開 AssemblyInfo.cs 中,包括下行的代碼,然後重新生成項目
[assembly:TagPrefix("ServerControlsLib ", "MyControl")]
> csc /t:library / out: ServerControlsLib.dll /r:System.dll /: System.Web.dll *.cs
用戶控件和自定義控件進行基本的區別是什麼?
<script type="text/javascript"></script> 現在,有用戶控件和自定義控件以及如何創建一個基本瞭解,讓我們看這兩者的區別在快速看。
因素 | 用戶控件 | 自定義控件 |
部署 | 用於單應用程序方案 應用程序的源代碼與的一起部署源形式 (.ascx) 如果在同一控件需要在多個應用程序中使用,介紹冗餘和維護問題 |
設計可由多個應用程序 部署應用程序的 Bin 目錄中或全局程序集緩存中 分發輕鬆且不與冗餘和維護相關的問題 |
創建 | 創建與 Web 窗體頁的創建,適合快速應用程序開發 (RAD) 方式類似 | 編寫涉及大量代碼,因爲沒有任何設計器支持 |
內容 | 更多好的選擇當您需要固定的佈局中的靜態內容時,是例如使時頁眉和頁腳 | 適合應用程序需要動態的更多要顯示的內容 ; 可重複使用的應用程序,是例如的數據與動態行的表格控件綁定 |
設計 | 編寫不需要多應用程序設計因爲它們都是在設計時編寫的主要包含靜態數據 | 從零開始編寫需要好地理解控件的生命週期和是通常執行負責在用戶控件中的順序在其中事件執行 |
高級的主題
<script type="text/javascript"></script> 下一步,讓我們看一看幾個可以開發自定義控件時使用的高級功能。
狀態管理
<script type="text/javascript"></script> Web 應用程序構建是無狀態的 HTTP 上。 其子控件和頁在每次請求創建,並通過請求後被釋放。 若要保持在傳統 ASP 編程中的狀態,您可以使用會話和應用程序的對象。 但是,需要執行大量代碼。 要避免這一點,ASP.NET 提供了稱爲多個請求之間維護狀態的視圖狀態一個機制。 若要進一步瞭解狀態管理和視圖,請訪問下面的 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/75x4ha6s(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/75x4ha6s(vs.71).aspx)
ASP.NET 視圖狀態
http://msdn.microsoft.com/msdnmag/issues/03/02/cuttingedge/default.aspx (http://msdn.microsoft.com/msdnmag/issues/03/02/cuttingedge/default.aspx)
保存 Web 窗體頁使用視圖狀態的值
http://msdn2.microsoft.com/en-us/library/4yfdwycw(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/4yfdwycw(vs.71).aspx)
使用自定義的控件中的視圖狀態的示例
<script type="text/javascript"></script> ViewStateExample.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text;
namespace ServerControlLib
{
/// <summary>
/// When a page framework reloads this control after postback, it
/// will restore the values which are in view state.
/// This control can easily perform state management without
/// implementing our own logic for maintaining the state.
/// </summary>
public class ViewStateExample : WebControl
{
// Text to be displayed in Text box control.
private string _text;
/*
* This property needs to be populated before every
* postback in order to
* retain its value.
*/
public string Text
{
get { return (_text == null) ? "_text property is empty" : _text; }
set { _text = value; }
}
/*
* This property needs to be filled once and should be
* available on the successive postbacks.
*/
public string TextInViewState
{
get
{
object o = ViewState["TextInViewState"];
return (o == null) ? "View state is empty" : (string)o;
}
set { ViewState["TextInViewState"] = value; }
}
/*
* Over-ridden method on WebControl base class which
* displays both of the property values
* i.e. one stored in view state and other which is not
* saved in view state.
*/
protected override void RenderContents(HtmlTextWriter writer)
{
writer.Write("Text Without View State = ");
writer.Write(Text);
writer.Write("<hr><br>");
writer.Write("Text In View State = ");
writer.Write(TextInViewState);
}
}
}
使用上一個 Web 窗體頁上的控件的示例
<script type="text/javascript"></script> ViewStateExampleDemo.aspx
<%@ Page Language="C#" %>
<%@ Register TagPrefix="CC" Namespace="ServerControlLib" Assembly = "ServerControlLib" %>
<html>
<head>
<script runat="server">
void button1_Click(object sender, EventArgs e)
{
Control1.Text = textbox1.Text;
Control1.TextInViewState = textbox2.Text;
}
</script>
</head>
<body>
<form runat="server" ID="Form1">
<br>
Property Value Without View State: <asp:TextBox id="textbox1"
runat="server" />
<br>
Property Value with View State: <asp:TextBox id="textbox2"
runat="server" />
<asp:Button text="Cause Postback" onClick="button1_Click"
id="button1" Runat="server" />
Output from the ViewStateExample Control :
<CC:ViewStateExample id="Control1" runat="server"/>
</form>
</body>
</html>
呈現
<script type="text/javascript"></script> 本節中, 我將簡要介紹從 Control 類或 WebControl 類派生自定義控件時應重寫的方法。
呈現 System.Web.UI.Control 類的方法
<script type="text/javascript"></script> 有關呈現方法在 System.Web.UI.Control 類的信息,請訪問下面的 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.render(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.control.render(vs.71).aspx)
Control.RenderControl 方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.rendercontrol(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.control.rendercontrol(vs.71).aspx)
Control.RenderChildren 方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.renderchildren(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.control.renderchildren(vs.71).aspx)
如何在頁面上呈現控件
<script type="text/javascript"></script> 每個頁都有代表該頁面的所有子控件的集合的控件樹。 若要顯示管理樹, HtmlTextWriter 類的創建對象,包含要在客戶端計算機上呈現 HTML。 該對象傳遞給 RenderControl 方法中。 反過來, RenderControl 方法將調用此 Render 方法。 然後, Render 方法會使一個遞歸循環,直到到達集合的末尾每個子控件上調用 RenderChildren 方法。 此過程最下面的示例代碼進行解釋。
public void RenderControl(HtmlTextWriter writer)
{
// Render method on that control will only be called if its visible property is true.
if (Visible)
{
Render(writer);
}
}
protected virtual void Render(HtmlTextWriter writer)
{
RenderChildren(writer);
}
protected virtual void RenderChildren(HtmlTextWriter writer)
{
foreach (Control c in Controls)
{
c.RenderControl(writer);
}
}
如果 (Visible) {Render(writer);}} 保護虛擬 void 呈現 (HtmlTextWriter 編寫器) {RenderChildren(writer);} 保護虛擬 void RenderChildren (HtmlTextWriter 編寫) {foreach (在控件中控制 c) {c.RenderControl(writer);}}
呈現 System.Web.UI.WebControl 類的方法
<script type="text/javascript"></script> 有關呈現方法 System.Web.UI.WebControl 類的信息,請訪問下面的 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.renderbegintag(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.renderbegintag(vs.71).aspx)
WebControl.RenderContents 方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.rendercontents(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.rendercontents(vs.71).aspx)
WebControl.RenderEndTag 方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.renderendtag(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.renderendtag(vs.71).aspx)
WebControl 類的呈現方式會發生
<script type="text/javascript"></script> 下面的代碼示例演示自定義控件在 Render 方法。
protected override void Render(HtmlTextWriter writer)
{
RenderBeginTag(writer);
RenderContents(writer);
RenderEndTag(writer);
}
不必重寫爲 WebControl 類 Render 方法。 如果要呈現在 WebControl 類中的內容,您需要重寫 RenderContents 方法。 但是,如果您仍然想重寫 Render 方法,您必須覆蓋 RenderBeginTag 方法以及上一代碼示例所示的特定順序 RenderEndTag 方法。
結論
<script type="text/javascript"></script>
這就爲現在用戶控件和 ASP.NET 1.0 和 ASP.NET 1.1 中的自定義控件。 我希望此列可幫助您瞭解基本的區別它們與不同的方法可用來開發它們之間。
感謝您的時間。 我們期望在不久的將來寫入詳細信息,如狀態管理、 控件樣式、 複合的控件和自定義的控件的設計時支持之類的自定義控件的高級主題。
有關控件的更多信息請訪問下面的 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/aa310918(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/aa310918(vs.71).aspx)
一個廣泛的 Examination of 用戶控件
http://msdn2.microsoft.com/en-us/library/ms972975.aspx (http://msdn2.microsoft.com/en-us/library/ms972975.aspx)
生成模板化自定義 ASP.NET 服務器控件
http://msdn2.microsoft.com/en-us/library/Aa478964.aspx (http://msdn2.microsoft.com/en-us/library/Aa478964.aspx)
在 ASP.NET 服務器控件中的事件
http://msdn2.microsoft.com/en-us/library/aa720049(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/aa720049(vs.71).aspx)
與用戶控件的複合控件
http://msdn2.microsoft.com/en-us/library/aa719735(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/aa719735(vs.71).aspx)
開發 ASP.NET 服務器控件
http://msdn2.microsoft.com/en-us/library/aa719973(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/aa719973(vs.71).aspx)
開發自定義控件: 主要概念
http://msdn2.microsoft.com/en-us/library/aa720226(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/aa720226(vs.71).aspx)
向 ASP.NET 控件添加設計時支持
http://msdn2.microsoft.com/en-us/library/Aa478960.aspx (http://msdn2.microsoft.com/en-us/library/Aa478960.aspx)