ASP.NET2.0服務(wù)器控件之Render方法
使用HtmlTextWriter類(lèi)
Control類(lèi)的Render方法主要用于實(shí)現(xiàn)控件呈現(xiàn),其聲明代碼如下:
如上代碼所示,Render方法的參數(shù)是一個(gè)HtmlTextWriter類(lèi)型。為了更好的應(yīng)用Render方法,讀者應(yīng)首先了解HtmlTextWriter類(lèi)及其相關(guān)內(nèi)容。
根據(jù)MSDN2005的描述,HtmlTextWriter類(lèi)用于將標(biāo)記字符和文本寫(xiě)入到ASP.NET服務(wù)器控件輸出流。此類(lèi)提供了ASP.NET服務(wù)器控件在向客戶(hù)端呈現(xiàn)標(biāo)記時(shí)所使用的格式設(shè)置功能。為了實(shí)現(xiàn)類(lèi)的功能,HtmlTextWriter類(lèi)定義了多個(gè)字段、屬性和方法。由于成員對(duì)象眾多,本文只挑選了一些常用成員加以說(shuō)明,同時(shí),還將介紹一些ASP.NET 2.0的新增成員。
常用成員對(duì)象包括:
·AddAttribute方法
對(duì)于HtmlTextWriter對(duì)象通過(guò)對(duì)RenderBeginTag方法的后續(xù)調(diào)用創(chuàng)建的元素,向其開(kāi)始標(biāo)記中添加指定的標(biāo)記屬性和值。
·AddStyleAttribute方法
對(duì)于 HtmlTextWriter 對(duì)象通過(guò)對(duì) RenderBeginTag 方法的后續(xù)調(diào)用創(chuàng)建的元素,向其開(kāi)始標(biāo)記中添加標(biāo)記樣式屬性。
·Write方法
將指定數(shù)據(jù)類(lèi)型連同任何掛起的制表符間距一起寫(xiě)入到輸出流。
·WriteAttribute方法
將標(biāo)記屬性及其值寫(xiě)入到輸出流。
·WriteBeginTag方法
任何制表符間距和指定標(biāo)記元素的開(kāi)始標(biāo)記寫(xiě)入到輸出流。
·WriteEndTag方法
寫(xiě)入指定的標(biāo)記元素的任何制表符間距和結(jié)束標(biāo)記。
·Encoding屬性
獲取 HtmlTextWriter 對(duì)象用于將內(nèi)容寫(xiě)入頁(yè)的編碼。
·Indent屬性
獲取或設(shè)置用以縮進(jìn)每一行標(biāo)記的開(kāi)始位置的制表符位置數(shù)。
·NewLine屬性
獲取或設(shè)置由 HtmlTextWriter 對(duì)象使用的行結(jié)束符字符串。
對(duì)于初學(xué)者而言,建議重點(diǎn)掌握以上成員對(duì)象的應(yīng)用。另外,ASP.NET 2.0還為HtmlTextWriter類(lèi)新增了一些成員,這些成員包括:
·BeginRender方法
通知 HtmlTextWriter 對(duì)象或派生類(lèi)的對(duì)象,某個(gè)控件將會(huì)呈現(xiàn)。
·EndRender方法
通知 HtmlTextWriter 對(duì)象或某個(gè)派生類(lèi)的對(duì)象,某控件已完成呈現(xiàn)。
·IsValidFormAttribute方法
檢查一個(gè)屬性以確保它可以在 <form> 標(biāo)記元素的開(kāi)始標(biāo)記中呈現(xiàn)。
·WriteEncodedUrl方法
對(duì)指定的 URL 進(jìn)行編碼,然后將它寫(xiě)入到輸出流。URL 可以包括參數(shù)。
·WriteEncodedText方法
對(duì)請(qǐng)求的設(shè)備的指定文本進(jìn)行編碼,然后將其寫(xiě)入到輸出流。
·WriteBreak方法
將 <br /> 標(biāo)記元素寫(xiě)入到輸出流。
使用Render方法實(shí)現(xiàn)控件呈現(xiàn)
1、基礎(chǔ)知識(shí)
本文所講解的Render方法隸屬于System.Web.UI.Controls.Control類(lèi)。該類(lèi)是創(chuàng)建服務(wù)器控件的基類(lèi),很多控件類(lèi)均繼承自該類(lèi)。在Control類(lèi)中包括三個(gè)用于實(shí)現(xiàn)控件呈現(xiàn)的方法:Render、RenderChildren和RenderControl。它們都使用HtmlTextWriter的實(shí)例作為參數(shù),它們?cè)试S為一個(gè)HtmlTextWriter對(duì)象提供服務(wù)器控件的內(nèi)容,并將其內(nèi)容封裝至HTTP輸出流中輸出到客戶(hù)端顯示。下面簡(jiǎn)單對(duì)這三個(gè)方法進(jìn)行簡(jiǎn)單介紹。
(1) protected virtual void Render(HtmlTextWriter writer);
該方法用于將服務(wù)器控件內(nèi)容發(fā)送到提供的HtmlTextWriter對(duì)象,此對(duì)象編寫(xiě)將在客戶(hù)端呈現(xiàn)的內(nèi)容。在開(kāi)發(fā)服務(wù)器控件時(shí),可以重寫(xiě)此方法以呈現(xiàn)服務(wù)器控件。
(2) protected virtual void RenderChildren(HtmlTextWriter writer);
該方法用于將服務(wù)器控件子級(jí)的內(nèi)容輸出到提供的HtmlTextWriter對(duì)象,此對(duì)象編寫(xiě)將在客戶(hù)端呈現(xiàn)的內(nèi)容。該方法通知ASP.NET呈現(xiàn)頁(yè)中的所有Active Server Pages代碼。如果頁(yè)上沒(méi)有任何ASP代碼,此方法將呈現(xiàn)服務(wù)器控件的所有子控件。
(3) protected virtual void RenderControl(HtmlTextWriter writer);和protected void RenderControl (HtmlTextWriter writer,ControlAdapter adapter)
RenderControl有兩個(gè)重載方法,它們都用于將服務(wù)器控件的內(nèi)容輸出到所提供的HtmlTextWriter對(duì)象中。如果已啟用跟蹤功能,則存儲(chǔ)有關(guān)控件的跟蹤信息。如果服務(wù)器控件的Visible屬性設(shè)置為true,該方法將確定是否啟用頁(yè)的跟蹤功能。如果啟用,它將存儲(chǔ)與控件有關(guān)的跟蹤信息,同時(shí)向頁(yè)呈現(xiàn)服務(wù)器控件的內(nèi)容。另外,前一個(gè)重載方式是ASP.NET 2.0從ASP.NET 1.0中繼承而言,后一個(gè)重載方式是ASP.NET 2.0新增的。后者具體使用提供的ControlAdapter對(duì)象將服務(wù)器控件內(nèi)容輸出到提供的HtmlTextWriter對(duì)象。其中參數(shù)adapter是ControlAdapter類(lèi)型,它用于定義呈現(xiàn)的ControlAdapter。當(dāng)實(shí)現(xiàn)在各種設(shè)備和瀏覽器中運(yùn)行的服務(wù)器控件時(shí),該方法比較常用。
以上3個(gè)方法看起來(lái)好像是獨(dú)立的3個(gè)方法,然而,實(shí)際上它們之間存在密切的聯(lián)系。讀者可通過(guò)閱讀以下示意性代碼,從而理解它們之間的關(guān)系。
public void RenderControl(HtmlTextWriter output)
{
if(Visible)
{
Render(output);
}
}
//Render方法基本實(shí)現(xiàn)
protected virtual void Render(HtmlTextWriter output)
{
RenderChildren(output);
}
//RenderChildren方法基本實(shí)現(xiàn)
protected virtual void RenderChildren(HtmlTextWriter output)
{
foreach(Control c in Controls)
{
c.RenderControl(output);
}
}
如上代碼所示,其中列舉了RenderControl、Render、RenderChildren方法的實(shí)現(xiàn)思路。顯而易見(jiàn)的是,在控件呈現(xiàn)過(guò)程中,這三個(gè)方法都在起著作用,而且使用了一個(gè)簡(jiǎn)單的遞歸調(diào)用過(guò)程。大體而言,可以理解為:
?。?)頁(yè)面框架建立一個(gè)HtmlTextWriter類(lèi)的實(shí)例;
?。?)頁(yè)面框架將這個(gè)實(shí)例對(duì)象傳遞給RenderControl方法;
?。?)RenderControl方法檢查控件的可視屬性Visible是否為true。如果為true,RenderControl方法將調(diào)用Render方法;如果為false,則不呈現(xiàn)該控件和其子控件;
?。?)Render方法執(zhí)行默認(rèn)實(shí)現(xiàn),調(diào)用RenderChildren方法;
(5)RenderChildren方法按照默認(rèn)實(shí)現(xiàn)中的設(shè)定調(diào)用每個(gè)子控件的RenderControl方法;
實(shí)際上,如果讀者短時(shí)間內(nèi)不能理解以上過(guò)程也沒(méi)有很大的關(guān)系。對(duì)于初學(xué)者而言,關(guān)鍵是要記住最重要、最常用的是Render方法。控件開(kāi)發(fā)者可以通過(guò)重寫(xiě)Render方法完成呈現(xiàn)控件的任務(wù)。
2、示例應(yīng)用
上文介紹了使用Control類(lèi)的Render方法實(shí)現(xiàn)控件呈現(xiàn)的基礎(chǔ)知識(shí)。下面將通過(guò)一個(gè)典型示例,幫助讀者初步理解Render的使用方法。示例效果如圖1所示。
如圖1所示,該服務(wù)器控件呈現(xiàn)了一個(gè)超鏈接,并且設(shè)置了文本為紅色。當(dāng)用戶(hù)單擊紅色文字時(shí),頁(yè)面將轉(zhuǎn)向微軟站點(diǎn)。當(dāng)然,用戶(hù)可以通過(guò)屬性L(fǎng)inkUrl來(lái)設(shè)置超鏈接地址。
下面列舉了示例實(shí)現(xiàn)源代碼。
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace UsingRenderControl
{
[DefaultProperty("LinkUrl")]
[ToolboxData("<{0}:RenderControl runat=server></{0}:RenderControl>")]
public class RenderControl : Control
{
// 實(shí)現(xiàn)LinkUrl
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("http://localhost/")]
[Localizable(true)]
public string LinkUrl
{
get { String s = (String)ViewState["LinkUrl"];
return ((s == null) ? String.Empty : s);}
set { ViewState["LinkUrl"] = value; }
}
// 重寫(xiě)Render方法
protected override void Render(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href, LinkUrl);
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write("瀏覽網(wǎng)站");
writer.RenderEndTag();
}
}
}
如上代碼實(shí)現(xiàn)了自定義服務(wù)器控件類(lèi)RenderControl。該類(lèi)從Control基類(lèi)繼承,具體實(shí)現(xiàn)了表示超鏈接地址的LinkUrl(默認(rèn)值為http://localhost/),并重寫(xiě)了Render方法。在重寫(xiě)Render的過(guò)程中,調(diào)用了一些HtmlTextWriter類(lèi)成員,例如,Writer、AddAttribute、AddStyleAttribute、RenderBeginTag和RenderEndTag方法等。另外,可能開(kāi)發(fā)人員在使用Writer方法過(guò)程中,需要呈現(xiàn)一個(gè)比較長(zhǎng)的字符串。建議此時(shí)多多使用Writer方法,而不要使用字符串級(jí)聯(lián)或者StringBuilder類(lèi)的相關(guān)方法進(jìn)行實(shí)現(xiàn)。因?yàn)椋菢訉?huì)消耗大量的系統(tǒng)時(shí)間和內(nèi)存,效率較低。
可能有一些讀者會(huì)問(wèn),如果將服務(wù)器控件呈現(xiàn)的多行代碼的順序變化一下,是否會(huì)有什么不同呢?例如,假設(shè)首先依次應(yīng)用RenderBeginTag、Write、RenderEndTag方法,然后再調(diào)用AddAttribute和AddStyleAttribute方法,那么會(huì)顯示相同的效果嗎?答案是否定的。這里需要強(qiáng)調(diào)的是:在呈現(xiàn)控件的過(guò)程中,首先要定義服務(wù)器控件的屬性和CSS樣式等內(nèi)容,然后再定義服務(wù)器控件的主體內(nèi)容,這種順序不能改變的。
另外,如果讀者感興趣可以在代碼中實(shí)現(xiàn)一個(gè)Text屬性,用于獲取或者設(shè)置控件所顯示的文本。這樣,在Render方法中,使用Write方法輸出的"瀏覽網(wǎng)站"文字內(nèi)容則可由Text屬性代替。
下面列舉了為使用以上的自定義服務(wù)器控件,而創(chuàng)建的Default.aspx文件源代碼。
<%@ Register TagPrefix="Sample" Assembly="UsingRenderControl" Namespace="UsingRenderControl" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>使用Render方法實(shí)現(xiàn)控件呈現(xiàn)</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<Sample:RenderControl runat="server" ID="CustomerControl" LinkUrl="http://www.microsoft.com/">
</Sample:RenderControl>
</div>
</form>
</body>
</html>
以上代碼比較簡(jiǎn)單,其中主要聲明了自定義服務(wù)器控件RenderControl,并設(shè)置其LinkUrl屬性值為http://www.microsoft.com,即微軟站點(diǎn)地址。
當(dāng)用戶(hù)在瀏覽器中運(yùn)行以上頁(yè)面,并查看相關(guān)的Html源文件時(shí),可得到如下的代碼:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 使用Render方法實(shí)現(xiàn)控件呈現(xiàn)</title>
</head>
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzMyMTY5NTU2ZGQQYrLd/G+vm1h41r2CEkxID63o5g==" />
</div>
<div>
<a style="color:red;">瀏覽網(wǎng)站</a>
</div>
</form>
</body>
</html>
通過(guò)觀察以上代碼可知,自定義服務(wù)器控件RenderControl實(shí)際呈現(xiàn)的結(jié)果是粗體所示部分的代碼,其最終呈現(xiàn)為一個(gè)表示超鏈接的<a>標(biāo)記。
小結(jié)
本文首先介紹了HtmlTextWriter類(lèi)的基本知識(shí),然后講解了使用Render方法實(shí)現(xiàn)控件呈現(xiàn)的應(yīng)用。在隨后的一篇文章中,筆者將說(shuō)明另外一種實(shí)現(xiàn)控件呈現(xiàn)的方法。從服務(wù)器控件開(kāi)發(fā)技術(shù)總體而言,控件呈現(xiàn)技術(shù)是開(kāi)發(fā)過(guò)程中最為常用,也是最為簡(jiǎn)單的內(nèi)容。建議讀者能夠熟練掌握其中的內(nèi)容。
相關(guān)文章
asp.net實(shí)現(xiàn)在非MVC中使用Razor模板引擎的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)在非MVC中使用Razor模板引擎的方法,較為詳細(xì)的分析了Razor模板引擎的使用技巧,需要的朋友可以參考下2015-06-06asp.net錯(cuò)誤處理Application_Error事件示例
Application_Error事件與Page_Error事件相類(lèi)似,可使用他捕獲發(fā)生在應(yīng)用程序中的錯(cuò)誤。由于事件發(fā)生在整個(gè)應(yīng)用程序范圍內(nèi),因此您可記錄應(yīng)用程序的錯(cuò)誤信息或處理其他可能發(fā)生的應(yīng)用程序級(jí)別的錯(cuò)誤2014-01-01ajaxControlToolkit中CascadingDropDown的用法說(shuō)明
今天頭叫寫(xiě)一個(gè)類(lèi)似三級(jí)聯(lián)動(dòng)的控件,最好實(shí)現(xiàn)無(wú)刷新,是石油軟件中的一個(gè)數(shù)據(jù),需要表現(xiàn)出類(lèi)似 X1-22 這樣的格式,上下標(biāo)的數(shù)據(jù)是固定的 想了很多辦法來(lái)表現(xiàn)這個(gè)數(shù)字,最后決定用3個(gè)DropDownList控件2008-11-11使用VSCode開(kāi)發(fā)和調(diào)試.NET Core程序的方法
這篇文章主要介紹了使用VSCode開(kāi)發(fā)和調(diào)試.NET Core程序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05教你Asp.net下使用mysql數(shù)據(jù)庫(kù)的步驟
近日,在項(xiàng)目中遇到了麻煩,客戶(hù)非要求使用mysql數(shù)據(jù)庫(kù),對(duì)于我從來(lái)么有使用過(guò)的人來(lái)說(shuō),很是頭疼,最后還是硬著頭皮弄好了。期間也遇到了各種各樣的問(wèn)題,現(xiàn)在把他整理在此,希望對(duì)那些和我一樣從來(lái)沒(méi)有使用過(guò)的人,能快速入手2012-05-05asp.net 大文件上傳 之 改版了的SlickUpload.HttpUploadModule(Krystalware
以下代碼中所注釋的部分是所改版的地方。:) Krystalware.SlickUpload.dll2009-05-05ASP.NET Datagridview自動(dòng)換行的小例子
這篇文章介紹了ASP.NET Datagridview自動(dòng)換行的代碼,有需要的朋友可以參考一下,希望對(duì)你有所幫助2013-07-07asp.net coolite 刪除時(shí)彈出確定按鈕
如果用coolite的 Confirm() 是不知道你選擇了什么的 如上代碼才可以的2009-09-09