控件呈现是指向HTTP输出流中写入标记文本de过程.服务器通过HTTP输出流向客户端发送生成de标记文本,这些文本将会通过客户端浏览器转换为可视化de元素显示出来.使用控件呈现,开发人员可以将HTML标记、脚本相关代码、CSS样式表等等输入到客户端浏览器.实现服务器控件呈现主要有两种方式:一是Control类deRender方法,二是WebControldeRenderContents方法.本文重点介绍使用Control类deRender方法实现控件呈现de应用.
使用HtmlTextWriter类
Control类deRender方法主要用于实现控件呈现,其声明相关代码如下:
protected virtual void Render(HtmlTextWriter output)
如上相关代码所示,Render方法de参数是一个HtmlTextWriter类型.为了更好de应用Render方法,读者应首先了解HtmlTextWriter类及其相关内容.
根据MSDN2005de描述,HtmlTextWriter类用于将标记字符和文本写入到ASP.NET服务器控件输出流.此类提供了ASP.NET服务器控件在向客户端呈现标记时所使用de格式设置功能.为了实现类de功能,HtmlTextWriter类定义了多个字段、属性和方法.由于成员对象众多,本文只挑选了一些常用成员加以说明,同时,还将介绍一些ASP.NET 2.0de新增成员.
常用成员对象包括:
·AddAttribute方法
对于HtmlTextWriter对象通过对RenderBeginTag方法de后续调用创建de元素,向其开始标记中添加指定de标记属性和值.
·AddStyleAttribute方法
对于 HtmlTextWriter 对象通过对 RenderBeginTag 方法de后续调用创建de元素,向其开始标记中添加标记样式属性.
·Write方法
将指定数据类型连同任何挂起de制表符间距一起写入到输出流.
·WriteAttribute方法
将标记属性及其值写入到输出流.
·WriteBeginTag方法
任何制表符间距和指定标记元素de开始标记写入到输出流.
·WriteEndTag方法
写入指定de标记元素de任何制表符间距和结束标记.
·Encoding属性
获取 HtmlTextWriter 对象用于将内容写入页de编码.
·Indent属性
获取或设置用以缩进每一行标记de开始位置de制表符位置数.
·NewLine属性
获取或设置由 HtmlTextWriter 对象使用de行结束符字符串.
对于初学者而言,建议重点掌握以上成员对象de应用.另外,ASP.NET 2.0还为HtmlTextWriter类新增了一些成员,这些成员包括:
·BeginRender方法
通知 HtmlTextWriter 对象或派生类de对象,某个控件将会呈现.
·EndRender方法
通知 HtmlTextWriter 对象或某个派生类de对象,某控件已完成呈现.
·IsValidFormAttribute方法
检查一个属性以确保它可以在 <form> 标记元素de开始标记中呈现.
·WriteEncodedUrl方法
对指定de URL 进行编码,然后将它写入到输出流.URL 可以包括参数.
·WriteEncodedText方法
对请求de设备de指定文本进行编码,然后将其写入到输出流.
·WriteBreak方法
将 <br /> 标记元素写入到输出流.
使用Render方法实现控件呈现
1、基础知识
本文所讲解deRender方法隶属于System.Web.UI.Controls.Control类.该类是创建服务器控件de基类,很多控件类均继承自该类.在Control类中包括三个用于实现控件呈现de方法:Render、RenderChildren和RenderControl.它们都使用HtmlTextWriterde实例作为参数,它们允许为一个HtmlTextWriter对象提供服务器控件de内容,并将其内容封装至HTTP输出流中输出到客户端显示.下面简单对这三个方法进行简单介绍.
(1) protected virtual void Render(HtmlTextWriter writer);
该方法用于将服务器控件内容发送到提供deHtmlTextWriter对象,此对象编写将在客户端呈现de内容.在开发服务器控件时,可以重写此方法以呈现服务器控件.
(2) protected virtual void RenderChildren(HtmlTextWriter writer);
该方法用于将服务器控件子级de内容输出到提供deHtmlTextWriter对象,此对象编写将在客户端呈现de内容.该方法通知ASP.NET呈现页中de所有Active Server Pages相关代码.如果页上没有任何ASP相关代码,此方法将呈现服务器控件de所有子控件.
(3) protected virtual void RenderControl(HtmlTextWriter writer);和protected void RenderControl (HtmlTextWriter writer,ControlAdapter adapter)
RenderControl有两个重载方法,它们都用于将服务器控件de内容输出到所提供deHtmlTextWriter对象中.如果已启用跟踪功能,则存储有关控件de跟踪信息.如果服务器控件deVisible属性设置为true,该方法将确定是否启用页de跟踪功能.如果启用,它将存储与控件有关de跟踪信息,同时向页呈现服务器控件de内容.另外,前一个重载方式是ASP.NET 2.0从ASP.NET 1.0中继承而言,后一个重载方式是ASP.NET 2.0新增de.后者具体使用提供deControlAdapter对象将服务器控件内容输出到提供deHtmlTextWriter对象.其中参数adapter是ControlAdapter类型,它用于定义呈现deControlAdapter.当实现在各种设备和浏览器中运行de服务器控件时,该方法比较常用.
以上3个方法看起来好像是独立de3个方法,然而,实际上它们之间存在密切de联系.读者可通过阅读以下示意性相关代码,从而理解它们之间de关系.
//RenderCotrol方法基本实现
public void RenderControl(HtmlTextWriter output)
{
if(Visible)
{
Render(output);
}
}
//Render方法基本实现
protected virtual void Render(HtmlTextWriter output)
{
RenderChildren(output);
}
//RenderChildren方法基本实现
protected virtual void RenderChildren(HtmlTextWriter output)
{
foreach(Control c in Controls)
{
c.RenderControl(output);
}
}
如上相关代码所示,其中列举了RenderControl、Render、RenderChildren方法de实现思路.显而易见de是,在控件呈现过程中,这三个方法都在起着作用,而且使用了一个简单de递归调用过程.大体而言,可以理解为:
(1)页面框架建立一个HtmlTextWriter类de实例;
(2)页面框架将这个实例对象传递给RenderControl方法;
(3)RenderControl方法检查控件de可视属性Visible是否为true.如果为true,RenderControl方法将调用Render方法;如果为false,则不呈现该控件和其子控件;
(4)Render方法执行默认实现,调用RenderChildren方法;
(5)RenderChildren方法按照默认实现中de设定调用每个子控件deRenderControl方法;
实际上,如果读者短时间内不能理解以上过程也没有很大de关系.对于初学者而言,关键是要记住最重要、最常用de是Render方法.控件开发者可以通过重写Render方法完成呈现控件de任务.
2、示例应用
上文介绍了使用Control类deRender方法实现控件呈现de基础知识.下面将通过一个典型示例,帮助读者初步理解Renderde使用方法.示例效果如图1所示.

图1效果图
如图1所示,该服务器控件呈现了一个超链接,并且设置了文本为红色.当用户单击红色文字时,页面将转向微软站点.当然,用户可以通过属性LinkUrl来设置超链接地址.
下面列举了示例实现源相关代码.
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
{
// 实现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(”浏览网站”);
writer.RenderEndTag();
}
}
}
如上相关代码实现了自定义服务器控件类RenderControl.该类从Control基类继承,具体实现了表示超链接地址deLinkUrl(默认值为http://localhost/),并重写了Render方法.在重写Renderde过程中,调用了一些HtmlTextWriter类成员,例如,Writer、AddAttribute、AddStyleAttribute、RenderBeginTag和RenderEndTag方法等.另外,可能开发人员在使用Writer方法过程中,需要呈现一个比较长de字符串.建议此时多多使用Writer方法,而不要使用字符串级联或者StringBuilder类de相关方法进行实现.因为,那样将会消耗大量de系统时间和内存,效率较低.
可能有一些读者会问,如果将服务器控件呈现de多行相关代码de顺序变化一下,是否会有什么不同呢?例如,假设首先依次应用RenderBeginTag、Write、RenderEndTag方法,然后再调用AddAttribute和AddStyleAttribute方法,那么会显示相同de效果吗?答案是否定de.这里需要强调de是:在呈现控件de过程中,首先要定义服务器控件de属性和CSS样式等内容,然后再定义服务器控件de主体内容,这种顺序不能改变de.
另外,如果读者感兴趣可以在相关代码中实现一个Text属性,用于获取或者设置控件所显示de文本.这样,在Render方法中,使用Write方法输出de”浏览网站”文字内容则可由Text属性代替.
下面列举了为使用以上de自定义服务器控件,而创建deDefault.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方法实现控件呈现</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>
以上相关代码比较简单,其中主要声明了自定义服务器控件RenderControl,并设置其LinkUrl属性值为http://www.microsoft.com,即微软站点地址.
当用户在浏览器中运行以上页面,并查看相关deHtml源文件时,可得到如下de相关代码:
<!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方法实现控件呈现</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 href=”http://www.microsoft.com/” style=”color:red;”>浏览网站</a>
</div>
</form>
</body>
</html>
通过观察以上相关代码可知,自定义服务器控件RenderControl实际呈现de结果是粗体所示部分de相关代码,其最终呈现为一个表示超链接de<a>标记.
小结 本文首先介绍了HtmlTextWriter类de基本知识,然后讲解了使用Render方法实现控件呈现de应用.在随后de一篇文章中,笔者将说明另外一种实现控件呈现de方法.从服务器控件开发技术总体而言,控件呈现技术是开发过程中最为常用,也是最为简单de内容.建议读者能够熟练掌握其中de内容.