一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

ASP.NET2.0服務(wù)器控件之Render方法

  控件呈現(xiàn)是指向HTTP輸出流中寫入標記文本的過程。服務(wù)器通過HTTP輸出流向客戶端發(fā)送生成的標記文本,這些文本將會通過客戶端瀏覽器轉(zhuǎn)換為可視化的元素顯示出來。使用控件呈現(xiàn),開發(fā)人員可以將HTML標記、腳本代碼、CSS樣式表等等輸入到客戶端瀏覽器。實現(xiàn)服務(wù)器控件呈現(xiàn)主要有兩種方式:一是Control類的Render方法,二是WebControl的RenderContents方法。本文重點介紹使用Control類的Render方法實現(xiàn)控件呈現(xiàn)的應用。

  使用HtmlTextWriter類

  Control類的Render方法主要用于實現(xiàn)控件呈現(xiàn),其聲明代碼如下:

protected virtual void Render(HtmlTextWriter output)


  如上代碼所示,Render方法的參數(shù)是一個HtmlTextWriter類型。為了更好的應用Render方法,讀者應首先了解HtmlTextWriter類及其相關(guān)內(nèi)容。

  根據(jù)MSDN2005的描述,HtmlTextWriter類用于將標記字符和文本寫入到ASP.NET服務(wù)器控件輸出流。此類提供了ASP.NET服務(wù)器控件在向客戶端呈現(xiàn)標記時所使用的格式設(shè)置功能。為了實現(xiàn)類的功能,HtmlTextWriter類定義了多個字段、屬性和方法。由于成員對象眾多,本文只挑選了一些常用成員加以說明,同時,還將介紹一些ASP.NET 2.0的新增成員。

  常用成員對象包括:

  ?AddAttribute方法

  對于HtmlTextWriter對象通過對RenderBeginTag方法的后續(xù)調(diào)用創(chuàng)建的元素,向其開始標記中添加指定的標記屬性和值。

  ?AddStyleAttribute方法

  對于 HtmlTextWriter 對象通過對 RenderBeginTag 方法的后續(xù)調(diào)用創(chuàng)建的元素,向其開始標記中添加標記樣式屬性。

  ?Write方法

  將指定數(shù)據(jù)類型連同任何掛起的制表符間距一起寫入到輸出流。

  ?WriteAttribute方法

  將標記屬性及其值寫入到輸出流。

  ?WriteBeginTag方法

  任何制表符間距和指定標記元素的開始標記寫入到輸出流。

  ?WriteEndTag方法

  寫入指定的標記元素的任何制表符間距和結(jié)束標記。

  ?Encoding屬性

  獲取 HtmlTextWriter 對象用于將內(nèi)容寫入頁的編碼。

  ?Indent屬性

  獲取或設(shè)置用以縮進每一行標記的開始位置的制表符位置數(shù)。

  ?NewLine屬性

  獲取或設(shè)置由 HtmlTextWriter 對象使用的行結(jié)束符字符串。

  對于初學者而言,建議重點掌握以上成員對象的應用。另外,ASP.NET 2.0還為HtmlTextWriter類新增了一些成員,這些成員包括:

  ?BeginRender方法

  通知 HtmlTextWriter 對象或派生類的對象,某個控件將會呈現(xiàn)。

  ?EndRender方法

  通知 HtmlTextWriter 對象或某個派生類的對象,某控件已完成呈現(xiàn)。

  ?IsValidFormAttribute方法

  檢查一個屬性以確保它可以在 <form> 標記元素的開始標記中呈現(xiàn)。

  ?WriteEncodedUrl方法

  對指定的 URL 進行編碼,然后將它寫入到輸出流。URL 可以包括參數(shù)。

  ?WriteEncodedText方法

  對請求的設(shè)備的指定文本進行編碼,然后將其寫入到輸出流。

  ?WriteBreak方法

  將 <br /> 標記元素寫入到輸出流。

  使用Render方法實現(xiàn)控件呈現(xiàn)

  1、基礎(chǔ)知識

  本文所講解的Render方法隸屬于System.Web.UI.Controls.Control類。該類是創(chuàng)建服務(wù)器控件的基類,很多控件類均繼承自該類。在Control類中包括三個用于實現(xiàn)控件呈現(xiàn)的方法:Render、RenderChildren和RenderControl。它們都使用HtmlTextWriter的實例作為參數(shù),它們允許為一個HtmlTextWriter對象提供服務(wù)器控件的內(nèi)容,并將其內(nèi)容封裝至HTTP輸出流中輸出到客戶端顯示。下面簡單對這三個方法進行簡單介紹。

  (1) protected virtual void Render(HtmlTextWriter writer);

  該方法用于將服務(wù)器控件內(nèi)容發(fā)送到提供的HtmlTextWriter對象,此對象編寫將在客戶端呈現(xiàn)的內(nèi)容。在開發(fā)服務(wù)器控件時,可以重寫此方法以呈現(xiàn)服務(wù)器控件。

  (2) protected virtual void RenderChildren(HtmlTextWriter writer);

  該方法用于將服務(wù)器控件子級的內(nèi)容輸出到提供的HtmlTextWriter對象,此對象編寫將在客戶端呈現(xiàn)的內(nèi)容。該方法通知ASP.NET呈現(xiàn)頁中的所有Active Server Pages代碼。如果頁上沒有任何ASP代碼,此方法將呈現(xiàn)服務(wù)器控件的所有子控件。

  (3) protected virtual void RenderControl(HtmlTextWriter writer);和protected void RenderControl (HtmlTextWriter writer,ControlAdapter adapter)

  RenderControl有兩個重載方法,它們都用于將服務(wù)器控件的內(nèi)容輸出到所提供的HtmlTextWriter對象中。如果已啟用跟蹤功能,則存儲有關(guān)控件的跟蹤信息。如果服務(wù)器控件的Visible屬性設(shè)置為true,該方法將確定是否啟用頁的跟蹤功能。如果啟用,它將存儲與控件有關(guān)的跟蹤信息,同時向頁呈現(xiàn)服務(wù)器控件的內(nèi)容。另外,前一個重載方式是ASP.NET 2.0從ASP.NET 1.0中繼承而言,后一個重載方式是ASP.NET 2.0新增的。后者具體使用提供的ControlAdapter對象將服務(wù)器控件內(nèi)容輸出到提供的HtmlTextWriter對象。其中參數(shù)adapter是ControlAdapter類型,它用于定義呈現(xiàn)的ControlAdapter。當實現(xiàn)在各種設(shè)備和瀏覽器中運行的服務(wù)器控件時,該方法比較常用。

  以上3個方法看起來好像是獨立的3個方法,然而,實際上它們之間存在密切的聯(lián)系。讀者可通過閱讀以下示意性代碼,從而理解它們之間的關(guān)系。

//RenderCotrol方法基本實現(xiàn)
public void RenderControl(HtmlTextWriter output)
{
 if(Visible)
 {
  Render(output);
 }
}
//Render方法基本實現(xiàn)
protected virtual void Render(HtmlTextWriter output)
{
 RenderChildren(output);
}
//RenderChildren方法基本實現(xiàn)
protected virtual void RenderChildren(HtmlTextWriter output)
{
 foreach(Control c in Controls)
 {
  c.RenderControl(output);
 }
}
  如上代碼所示,其中列舉了RenderControl、Render、RenderChildren方法的實現(xiàn)思路。顯而易見的是,在控件呈現(xiàn)過程中,這三個方法都在起著作用,而且使用了一個簡單的遞歸調(diào)用過程。大體而言,可以理解為:

 ?。?)頁面框架建立一個HtmlTextWriter類的實例;

  (2)頁面框架將這個實例對象傳遞給RenderControl方法;

  (3)RenderControl方法檢查控件的可視屬性Visible是否為true。如果為true,RenderControl方法將調(diào)用Render方法;如果為false,則不呈現(xiàn)該控件和其子控件;

 ?。?)Render方法執(zhí)行默認實現(xiàn),調(diào)用RenderChildren方法;

 ?。?)RenderChildren方法按照默認實現(xiàn)中的設(shè)定調(diào)用每個子控件的RenderControl方法;

  實際上,如果讀者短時間內(nèi)不能理解以上過程也沒有很大的關(guān)系。對于初學者而言,關(guān)鍵是要記住最重要、最常用的是Render方法。控件開發(fā)者可以通過重寫Render方法完成呈現(xiàn)控件的任務(wù)。

  2、示例應用

  上文介紹了使用Control類的Render方法實現(xiàn)控件呈現(xiàn)的基礎(chǔ)知識。下面將通過一個典型示例,幫助讀者初步理解Render的使用方法。示例效果如圖1所示。

按此在新窗口瀏覽圖片
圖1效果圖
  如圖1所示,該服務(wù)器控件呈現(xiàn)了一個超鏈接,并且設(shè)置了文本為紅色。當用戶單擊紅色文字時,頁面將轉(zhuǎn)向微軟站點。當然,用戶可以通過屬性LinkUrl來設(shè)置超鏈接地址。

  下面列舉了示例實現(xiàn)源代碼。

using System;
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
 {
  // 實現(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; }
  }
  // 重寫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();
  }
 }
}
  如上代碼實現(xiàn)了自定義服務(wù)器控件類RenderControl。該類從Control基類繼承,具體實現(xiàn)了表示超鏈接地址的LinkUrl(默認值為http://localhost/),并重寫了Render方法。在重寫Render的過程中,調(diào)用了一些HtmlTextWriter類成員,例如,Writer、AddAttribute、AddStyleAttribute、RenderBeginTag和RenderEndTag方法等。另外,可能開發(fā)人員在使用Writer方法過程中,需要呈現(xiàn)一個比較長的字符串。建議此時多多使用Writer方法,而不要使用字符串級聯(lián)或者StringBuilder類的相關(guān)方法進行實現(xiàn)。因為,那樣將會消耗大量的系統(tǒng)時間和內(nèi)存,效率較低。

  可能有一些讀者會問,如果將服務(wù)器控件呈現(xiàn)的多行代碼的順序變化一下,是否會有什么不同呢?例如,假設(shè)首先依次應用RenderBeginTag、Write、RenderEndTag方法,然后再調(diào)用AddAttribute和AddStyleAttribute方法,那么會顯示相同的效果嗎?答案是否定的。這里需要強調(diào)的是:在呈現(xiàn)控件的過程中,首先要定義服務(wù)器控件的屬性和CSS樣式等內(nèi)容,然后再定義服務(wù)器控件的主體內(nèi)容,這種順序不能改變的。

  另外,如果讀者感興趣可以在代碼中實現(xiàn)一個Text屬性,用于獲取或者設(shè)置控件所顯示的文本。這樣,在Render方法中,使用Write方法輸出的"瀏覽網(wǎng)站"文字內(nèi)容則可由Text屬性代替。

  下面列舉了為使用以上的自定義服務(wù)器控件,而創(chuàng)建的Default.ASPx文件源代碼。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.ASPx.cs" Inherits="_Default" %>
<%@ 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方法實現(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>
  以上代碼比較簡單,其中主要聲明了自定義服務(wù)器控件RenderControl,并設(shè)置其LinkUrl屬性值為http://www.microsoft.com,即微軟站點地址。

  當用戶在瀏覽器中運行以上頁面,并查看相關(guān)的Html源文件時,可得到如下的代碼:

<!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>
<title> 使用Render方法實現(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>
  通過觀察以上代碼可知,自定義服務(wù)器控件RenderControl實際呈現(xiàn)的結(jié)果是粗體所示部分的代碼,其最終呈現(xiàn)為一個表示超鏈接的<a>標記。

  小結(jié)

  本文首先介紹了HtmlTextWriter類的基本知識,然后講解了使用Render方法實現(xiàn)控件呈現(xiàn)的應用。在隨后的一篇文章中,筆者將說明另外一種實現(xiàn)控件呈現(xiàn)的方法。從服務(wù)器控件開發(fā)技術(shù)總體而言,控件呈現(xiàn)技術(shù)是開發(fā)過程中最為常用,也是最為簡單的內(nèi)容。建議讀者能夠熟練掌握其中的內(nèi)容。

AspNet技術(shù)ASP.NET2.0服務(wù)器控件之Render方法,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美日韩一区二区在线观看视频 | 亚洲一区二区在线免费观看 | 在线观看a网站 | 婷婷激情五月 | 亚洲一区二区在线免费观看 | 黄色网址中文字幕 | 成人激情视频网站 | 青青草原播放器 | 欧美极品欧美精品欧美图片 | 久久人人草 | 在线成人爽a毛片免费软件 在线成人小视频 | 成人午夜视频在线播放 | 91成人影院未满十八勿入 | 精品视频一区二区三三区四区 | 国产久热香蕉在线观看 | 久久66久这里精品99 | 97在线影院 | 国产成人综合亚洲亚洲欧美 | 亚洲一区二区三区网站 | 成年人三级网站 | 日本三级一区二区 | 成人福利在线视频 | 国产精品高清一区二区 | 97超级碰久久久久香蕉人人 | 国产成人亚洲精品无广告 | 国产成人女人在线视频观看 | 久艾草国产成人综合在线视频 | 91精品在线播放 | 亚洲视频国产视频 | 日本 3344www高清在线 | 怡红院在线观看精品 | 国产免费一区二区三区最新 | 久久精品94精品久久精品 | 精品免费久久久久久影院 | 日本激情网址 | 成人国产在线视频在线观看 | 色在线播放 | 69堂国产成人精品视频不卡 | 欧美yw193.c㎝在线观看 | 最新国产精品视频免费看 | 国产精品第 |