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所示。


图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方法实现控件呈现的应用。在随后的一篇文章中,笔者将说明另外一种实现控件呈现的方法。从服务器控件开发技术总体而言,控件呈现技术是开发过程中最为常用,也是最为简单的内容。建议读者能够熟练掌握其中的内容。

(0)

相关推荐

  • jQuery生成asp.net服务器控件的代码

    HTML如下 复制代码 代码如下: <tr> <td class="leftTd" style="width: 107px">附加金额</td> <td style="width: 315px"><asp:TextBox ID="txtExtendMoney" Text="0" runat="server"></asp:T

  • ASP.NET 2.0服务器控件开发之复杂属性

    在上一篇文章中,曾经提及"复杂属性"的概念.复杂属性的最大特征是属性的类型是本身具有属性(称为子属性)的类.通常情况下,复杂属性表现为3种形式:连字符形式属性.内部嵌套形式属性和内部嵌套形式默认属性.本文将介绍以上3种形式复杂属性的具体实现方法. 1. 实现连字符形式复杂属性 连字符形式属性是比较常见的复杂属性.我们常用的Font属性就是一个复杂属性,其包括多个子属性,如Bold.Name等.这种类型属性具有两种语法格式:一种是利用连字符语法,在控件的开始标记中保存子属性,例如,Fon

  • ASP.NET2.0服务器控件之类型转换器

    类型转换器是实现自定义服务器控件属性过程中比较重要的内容.本文将对类型转换器的基本概念和实现方法进行介绍. 1. 类型转换器基本概念 类型转换器是自定义服务器控件的辅助性功能实现.它主要用于执行从字符串表示形式到指定类型之间的双向转换.例如,以文本形式表示属性值,将用户输入的文本转换为相应数据类型等等,都应用了类型转换器. 对于多数基本数据类型(如Int32.Bool.Char.String.枚举类型等),.net框架已经为它们提供了默认的类型转换器,这些类型转换器完成从字符串到相关值的转换并执

  • ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重写该方法为控件提供初始化逻辑.此后,页面框架将调用TrackViewState方法来跟踪视图状态.需要注意的是:多数情况下,Control基类提供的TrackViewState方法实现已经足够了.只有在控件定义

  • asp.net Textbox服务器控件

    复制代码 代码如下: <body>    <form id="form1" runat="server">    <div> 姓名:<asp:TextBox ID="txtUser" runat="server"></asp:TextBox>        <br />        <br />        性别:<asp:Radio

  • ASP.NET入门之HTML服务器控件概述

    ASP.NET 中的HTML服务器控件是服务器可理解的HTML标签. ASP.NET 文件中的 HTML 元素默认作为文本进行处理.为了使这些元素可编程化,需要向 HTML 元素添加 runat="server" 属性.该属性指示该元素应作为服务器控件进行处理. 注意: 1.所有 HTML 服务器控件必须位于带有 runat="server" 属性的标签内! 2.ASP.NET 要求所有 HTML 元素必须正确关闭和嵌套. HTML服务器空间及相关描述如下表所示:

  • ASP.NET 动态写入服务器端控件第1/2页

    关于动态写入html标签控件,大家都熟悉,这里就不再表述.本文讨论的重点是:如何动态写入服务器端控件,并且在页面PostBack到Server端时,在Server端来获取被动态写入的服务器端控件的各种属性. 这里,我来通过一个Demo来说明这个应用. 需求: 1. 用户在UI上输入一个数值(比如:5),系统动态为用户加载这个数值的Url Address输入域; 2. 用户输入的Url Address内容需要通过Url格式验证; 3. 用户提交输入内容后,系统给出提交的结果 设计如下: 1. Cs

  • ASP.NET自定义Web服务器控件之Button控件

    本文实例讲述了ASP.NET自定义Web服务器控件之Button控件实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Linq;  using System.Text;  using System.Web;  using System.Web.UI;  using System.Web.U

  • ASP.NET2.0服务器控件之自定义状态管理

    在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化视图状态管理时,则必须实现自定

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

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

  • ASP.NET2.0缓存(Cache)技术深入理解

    ASP.NET2.0提供了一些新的用于提升程序性能的技术特性,其中,缓存技术是非常重要的一个特性,它提供了一种非常好的本地数据缓存机制,从而有效的提高数据访问的性能. 数据缓存(DataCaching)就是将数据暂存于内存缓存区中(有时也暂存于硬盘缓存区中)的一种技术.当数据本身改变得不怎么频繁,而被访问的频率又比较高时,采用这种技术将大大提高警惕数据访问的效率. 1.网页输出缓存 (1)加显缓存 <%@OutputCacheDuration="60"VaryByParam=no

  • ASP.NET2.0 WebRource,开发微调按钮控件

    现在.有许多开发人员已经在使用ASP.NET2.0的WebResource的功能了.WebResource允许我们嵌入资源到程序集中.包括图像,文本等. 在介绍WebResource就不得不介绍一下WebResource.axd,我们来看一下 script language="javascript"     src="WebResource.axd?a=s&r=WebUIValidation.js&t=631944362841472848"    

  • ASP.NET2.0+SQL Server2005构建多层应用第1/4页

    [推荐]ASP.NET2.0+SQL Server2005构建多层应用!!!!!@申请加分!@@! [sell=5]随着.NET 2.0的发布,将会使得使用ASP.NET 2.0来构建的Web应用越来越容易.使用ASP.NET 2.0和SQL Server 2005,将会比ASP.NET 1.1更方便地构建多层体系架构的web应用.本文,将使用ASP.NET 2.0和SQL Server 2005 (.net使用Visual Studio 2005 beta 2,SQL Server 2005使

  • ASP.NET2.0:页面中链入的CSS、js文件带中文时需注意

    当定义的样式中有中文时,如 .sometyle {font-family:@黑体;},如果书写不正确,如写成 .sometyle {font-family: 黑体;},这应该是个错误的写法,这样不仅这个样式不起作用,而且还会影响到定义在它后面的样式起作用,不知道对css的解析本来就是这个规则,还是ASP.NET 2.0的问题. 当你直接把从网上download下来的js文件加入的VS2005项目中时,如果此文件中带中文,当你调用其方法时,就会出现对象找不到的js错误,就像你没有链如该文件一样.你

  • ASP.NET2.0使用Enter Key作为默认提交问题分析(附源码)

    本文实例分析了ASP.NET2.0使用Enter Key作为默认提交的方法.分享给大家供大家参考,具体如下: 网页开发中最烦人的事情之一就是为表单处理"Enter key" ,"Enter key"已经成为用户提交表单的偏好.虽然我们为用户提供了提交按钮,但是最简单也是最直接的方式仍然是:输入文字,然后回车完成提交 ASP.NET 2.0中为此提供了很好的解决方法.只需要将"defaultbutton"属性指定到想要引发事件的按钮控件的ID上就可

  • Asp.Net2.0权限树中Checkbox的操作

    这里使用asp.net2.0的TreeView控件结合JavaScript实现权限树的部分功能. 假设权限树中有如下三条规则: 1.该节点可以访问,则他的父节点也必能访问: 2.该节点可以访问,则他的子节点也都能访问: 3.该节点不可访问,则他的子节点也不能访问. 代码如下://获取元素指定tagName的父元素function public_GetParentByTagName(element, tagName) {    var parent = element.parentNode;   

  • 在ASP.NET2.0中通过Gmail发送邮件的代码

    在这里我们主要是使用Gmail,究其原因,是因为,我在使用Gmail的邮箱发送邮件的时候,遇到一小小的困难,而使用163等邮箱的时候,没遇到这个问题.     在ASP.NET2.0中,发送邮件是很简单的,我们主要使用来自命名空间System.Net.Mail中的几个类,MailMessage和SmtpClient.     核心代码是很简洁的,如下:     复制代码 代码如下: string to = "这里填写接收者的Email地址";      string from = &q

随机推荐