zoukankan      html  css  js  c++  java
  • ASP.NET2.0服务器控件之Render方法 (作者: 金属边缘 出处: 天极开发 )

    原文地址:http://dev.yesky.com/msdn/228/2411728.shtml

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

  • 相关阅读:
    PHP base_convert() 函数详解
    PHP中位运算符
    MySQL中SQL Mode的查看与设置
    HTML 字符实体详情
    php7中 ?? 和 ?: 的区别
    正则表达式详解
    PHP sprintf() 函数详解
    php-config——PHP配置信息的查看
    无界工作记录
    CMake根据平台移植检查设置文件编译选项
  • 原文地址:https://www.cnblogs.com/malaikuangren/p/1210326.html
Copyright © 2011-2022 走看看