ASP.NET2.0服务器控件之Render方法

本文示例源代码或素材下载

  控件呈现是指向HTTP输出流中写入标记文本的 过程 。服务器通过HTTP输出流向客户端发送生成的标记文本,这些文本将会通过客户端浏览器转换为可视化的 元素 显示出来。使用控件呈现,开发人员可以将HTML标记、脚本代码、CSS样式表等等输入到客户端浏览器。实现服务器控件呈现主要有两种方式:一是Control类的Render 方法 ,二是WebControl的RenderContents方法。本文重点介绍使用Control类的Render方法实现控件呈现的应用。

  使用HtmlTextWriter类

  Control类的Render方法主要用于实现控件呈现,其声明代码如下:

protected virtual void Render(HtmlTextWriter output)

  如上代码所示,Render方法的参数是一个HtmlTextWriter类型。为了更好的应用Render方法,读者应首先了解HtmlTextWriter类及其相关内容。

  根据MSDN2005的描述,HtmlTextWriter类用于将标记字符和文本写入到ASP.NET服务器控件输出流。此类提供了ASP.NET服务器控件在向客户端呈现标记时所使用的格式设置 功能 。为了实现类的功能,HtmlTextWriter类定义了多个字段、属性和方法。由于成员对象众多,本文只挑选了一些常用成员加以说明,同时,还将介绍一些ASP.NET 2.0的新增成员。

  常用成员对象包括:

  ·AddAttribute方法

  对于HtmlTextWriter对象通过对RenderBeginTag方法的后续调用创建的元素,向其开始标记中添加指定的标记属性 和值

  ·AddStyleAttribute方法

  对于 HtmlTextWriter 对象通过对 RenderBeginTag 方法的后续调用创建的元素,向其开始标记中添加标记样式属性。

  ·Write方法

  将指定数据类型连同任何挂起的制表符间距一起写入到输出流。

 

·WriteAttribute 方法

  将标记属性及其值写入到输出流。

  ·WriteBeginTag方法

  任何制表符间距和指定标记 元素 的开始标记写入到输出流。

  ·WriteEndTag方法

  写入指定的标记元素的任何制表符间距和结束标记。

  ·Encoding属性

  获取 HtmlTextWriter 对象用于将 内容 写入页的编码。

  ·Indent属性

  获取或设置用以缩进每一行标记的开始位置的制表符位置数。

  ·NewLine属性

  获取或设置由 HtmlTextWriter 对象使用的行结束符字符串。

  对于初学者而言,建议重点掌握以上成员对象的应用。另外,ASP.NET 2.0还为HtmlTextWriter类新增了一些成员,这些成员包括:

  ·BeginRender方法

  通知 HtmlTextWriter 对象或派生类的对象,某个控件将会呈现。

  ·EndRender方法

  通知 HtmlTextWriter 对象或某个派生类的对象,某控件已完成呈现。

  ·IsValidFormAttribute方法

   检查 一个属性以确保它可以在 <form> 标记元素的开始标记中呈现。

  ·WriteEncodedUrl方法

  对指定的 URL 进行编码,然后将它写入到输出流。URL 可以包括参数。

  ·WriteEncodedText方法

  对请求的设备的指定文本进行编码,然后将其写入到输出流。

  ·WriteBreak方法

  将 <br /> 标记元素写入到输出流。

  使用Render方法实现控件呈现

  1、基础知识

  本文所讲解的Render方法隶属于System.Web.UI.Controls.Control类。该类是创建服务器控件的基类,很多控件类均继承自该类。在Control类中包括三个用于实现控件呈现的方法:Render、RenderChildren和RenderControl。它们都使用HtmlTextWriter的实例作为参数,它们允许为一个HtmlTextWriter对象提供服务器控件的内容,并将其内容封装至HTTP输出流中输出到客户端显示。下面简单对这三个方法进行简单介绍。

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

  该方法用于将服务器控件 内容 发送到提供的HtmlTextWriter对象,此对象编写将在客户端呈现的内容。在开发服务器控件时,可以重写此方法以呈现服务器控件。

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

  该 方法 用于将服务器控件子级的内容输出到提供的HtmlTextWriter对象,此对象编写将在客户端呈现的内容。该方法通知ASP.NET呈现页中的所有Active Server Pages代码。如果页上没有任何ASP代码,此方法将呈现服务器控件的所有子控件。

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

  RenderControl有两个重载方法,它们都用于将服务器控件的内容输出到所提供的HtmlTextWriter对象中。如果已启用跟踪 功能 ,则存储有关控件的跟踪信息。如果服务器控件的Visible属性设置为true,该方法将确定是否启用页的跟踪功能。如果启用,它将存储与控件有关的跟踪信息,同时向页呈现服务器控件的内容。另外,前一个重载方式是ASP.NET 2.0从ASP.NET 1.0中继承而言,后一个重载方式是ASP.NET 2.0新增的。后者具体使用提供的ControlAdapter对象将服务器控件内容输出到提供的HtmlTextWriter对象。其中参数adapter是ControlAdapter类型,它用于定义呈现的ControlAdapter。当实现在各种设备和浏览器中运行的服务器控件时,该方法比较常用。

  以上3个方法看起来好像是独立的3个方法,然而,实际上它们之间存在密切的联系。读者可通过阅读以下示意性代码,从而理解它们之间的关系。

//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方法的实现思路。显而易见的是,在控件呈现过程中,这三个方法都在起着作用,而且使用了一个简单的递归调用过程。大体而言,可以理解为:

  (1)页面框架建立一个HtmlTextWriter类的实例;

  (2)页面框架将这个实例对象传递给RenderControl方法;

  (3)RenderControl方法检查控件的可视属性Visible是否为true。如果为true,RenderControl方法将调用Render方法;如果为false,则不呈现该控件和其子控件;

  (4)Render方法执行默认实现,调用RenderChildren方法;

  (5)RenderChildren方法按照默认实现中的设定调用每个子控件的RenderControl方法;

  实际上,如果读者短时间内不能理解以上过程也没有很大的关系。对于初学者而言,关键是要记住最重要、最常用的是Render方法。控件开发者可以通过重写Render方法完成呈现控件的任务。

  2、示例应用

  上文介绍了使用Control类的Render方法实现控件呈现的基础知识。下面将通过一个典型示例,帮助读者初步理解Render的使用方法。示例效果如图1所示。

ASP.NET2.0服务器控件之Render方法

 

  图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基类继承,具体实现了表示超链接地址的LinkUrl(默认值为http://localhost/),并重写了Render 方法 。在重写Render的过程中,调用了一些HtmlTextWriter类成员,例如,Writer、AddAttribute、AddStyleAttribute、RenderBeginTag和RenderEndTag方法等。另外,可能开发人员在使用Writer方法过程中,需要呈现一个比较长的字符串。建议此时多多使用Writer方法,而不要使用字符串级联或者StringBuilder类的相关方法进行实现。因为,那样将会消耗大量的系统时间和 内存 ,效率较低。

  可能有一些 读者 会问,如果将服务器控件呈现的多行代码的顺序变化一下,是否会有什么不同呢?例如,假设首先依次应用RenderBeginTag、Write、RenderEndTag方法,然后再调用AddAttribute和AddStyleAttribute方法,那么会显示相同的效果吗?答案是否定的。这里需要强调的是:在呈现控件的过程中,首先要定义服务器控件的属性和CSS样式等 内容 ,然后再定义服务器控件的主体内容,这种顺序不能改变的。

  另外,如果读者感兴趣可以在代码中实现一个Text属性,用于获取或者设置控件所显示的文本。这样,在Render方法中,使用Write方法输出的"浏览网站"文字内容则可由Text属性代替。

  下面列举了为使用以上的自定义服务器控件,而创建的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方法实现控件呈现</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,即微软站点地址。

  当用户在浏览器中运行以上页面,并查看相关的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方法实现控件呈现</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实际呈现的结果是粗体所示部分的代码,其最终呈现为一个表示超链接的<a>标记。

  小结

  本文首先介绍了HtmlTextWriter类的基本知识,然后讲解了使用Render方法实现控件呈现的应用。在随后的一篇文章中,笔者将说明另外一种实现控件呈现的方法。从服务器控件开发技术总体而言,控件呈现技术是开发过程中最为常用,也是最为简单的内容。建议读者能够熟练掌握其中的内容。

你可能感兴趣的:(asp.net)