ASP.NET服务器控件之RenderContents简介

开发 后端
ASP.NET服务器控件之RenderContents是什么呢本文就向你介绍ASP.NET服务器控件之RenderContents的基本知识,所包含的属性的各个特点等。

ASP.NET服务器控件之RenderContents的介绍:

本文重点介绍另一种实现控件呈现的常用方法--使用WebControl类的RenderContents方法实现控件呈现。

基础知识

就ASP.NET服务器控件而言只存在两种情况:一种是具有外观可视化元素的控件,还有一种是不具有外观可视化元素的控件。如果需要开发的服务器控件包含可视化元素,那么多数情况下,建议开发人员创建继承自System.Web.UI.WebControls.WebControl基类的控件类。这种做法的主要原因是基于便捷性考虑。因为,WebControl类可提供服务器控件的部分与外观有关的公共属性、方法和事件等。通过该类定义的属性,可以控制服务器控件的外观和行为。例如,使用BackColor和ForeColor属性,可以分别控制服务器控件的背景色和前景颜色;在可以显示边框的控件上,可以通过设置BorderWidth、BorderStyle和BorderColor属性,控制边框宽度、边框样式和边框颜色;服务器控件的大小可以通过Height和Width属性来指定等等。如果控件基类是Control类,那么实现这些类似内容则非常繁琐。

在使用WebControl基类实现ASP.NET服务器控件呈现的过程中,必然要使用该类所提供的属性和方法等成员对象。这是读者需要重点掌握的内容。另外,对于该基类的构造函数也是不容忽视的。下面首先从WebControl的构造函数开始入手进行讲解,随后将说明常见的成员对象。

WebControl类包括三个构造函数,它们都用于初始化WebControl类的新实例,然而它们之间还存在一些细小的差异。

◆protected WebControl ()

该构造函数用于初始化表示Span HTML元素的WebControl类的新实例。通常情况下,开发人员并不直接调用此构造函数。相反,它通常由派生类的构造函数调用以将TagKey属性初始化为Span枚举值。在随后的示例中,将重写TagKey属性,从而调用此构造函数。

◆public WebControl (HtmlTextWriterTag tag)

开发人员可使用此构造函数创建并初始化使用指定的System.Web.UI.HtmlTextWriterTag值的WebControl类的新实例。其中的参数tag表示HtmlTextWriterTag枚举值之一。可能读者对于HtmlTextWriterTag还不太熟悉。它是一个枚举类型,其枚举值多为HTML标记,例如,A、B、Bold、Button等等。

◆protected WebControl (string tag)

使用此构造函数可创建并初始化使用指定的HTML标记的WebControl类的新实例。其中参数tag表示HTML标记。当使用该构造函数时一定要注意:不能直接调用此构造函数。相反,它通常由派生类的构造函数调用以初始化TagKey和TagName属性。

在了解了WebControl类的构造函数之后,读者还必须了解WebControl类的一些常用属性和方法。下面列举了这些常用成员对象,它们对于实现ASP.NET服务器控件呈现有着重要意义。

(1)Attributes属性

该属性用于获取与控件的属性不对应的任意特性(只用于呈现)的集合,其属性类型为AttributeCollection。

(2)ControlStyle属性

该属性用于获取服务器控件的样式,它是Style类型。ControlStyle属性封装WebControl类的所有外观属性,如BorderColor和Font。

(3)TagKey属性

该属性用于获取与此服务器控件相对应的System.Web.UI.HtmlTextWriterTag值,其属性类型为HtmlTextWriterTag枚举。

(4)protected virtual void AddAttributeToRender(HtmlTextWriter writer);

该方法将需要呈现的HTML属性和样式添加到指定的System.Web.UI.HtmlTextWriter中。注意在重写过程中,一定要调用基类中相应的方法。

(5)public void ApplyStyle(Style s);

该方法将指定样式的所有非空白元素复制到控件,改写控件的所有现有的样式元素。

(6)public void MergeStyle(Style s);

该方法将指定样式的所有非空白元素复制到控件,但不改写该控件现有的任何样式元素。

(7)protected override void Render(HtmlTextWriter writer);方法

该方法重写了Control.Render。

(8)protected virtual void RenderContents(HtmlTextWriter writer);

该方法将ASP.NET服务器控件的内容呈现到指定的编写器中。如果要在控件的标签中写入文本或其他内容,则需要重写该方法;如果要使用默认逻辑来呈现子控件,那么一定要调用基类中相应的方法。

可能读者已经注意到WebControl基类中包括的两个方法:Render和RenderContents。根据上文所介绍的内容可知,Control基类中包括Render方法。由于WebControl类继承自Control类,因此,WebControl类中包含Render方法是无可非议的。然而,WebControl类中却有一个RenderContents方法,并且该方法与Render方法在功能、参数等方面都非常相似。那么在呈现控件过程中到底应该使用哪一个呢?

实际上,在通常情况下,如果服务器控件自WebControl基类派生,那么其中的Render方法很少使用,而主要使用RenderContents方法实现控件呈现。为了说明其中的原因,我们必须了解WebControl基类中Render方法的实现逻辑。

在WebControl基类中的Render方法的实现示意性代码如下所示:

  1. protected override void Render(HtmlTextWriter output)  
  2. {  
  3.  RenderBeginTag(output);  
  4.  RenderContents(output);  
  5.  RenderEndTag(output);  
  6. }  

在WebControl基类中的RenderBeginTag方法的实现示意性代码如下:

  1. public virtual void RenderBeginTag(HtmlTextWriter output)  
  2. {  
  3.  AddAttributesToRender(output);   
  4.  HtmlTextWriterTag tagKey = TagKey;  
  5.  if(tagKey != HtmlTextWriterTag.Unknown)  
  6.  {  
  7. output.RenderBeginTag(tagKey);   
  8.  } else {  
  9. output.RenderBeginTag(this.TagName);  
  10.  }  
  11. }  

在WebControl基类中的RenderContents方法的实现示意性代码如下:

  1. protected override void RenderContents(HtmlTextWriter output){   
  2.  //使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。   
  3.  base.Render(output);  
  4. }  

分析以上代码可以得出以下结论:

一、为了在由WebControl派生的类中实现控件呈现,必须重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法中的一个或者多个,而不必重写Render方法。

二、重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法非常重要(请注意重写这些方法的条件及注意事项),否则服务器控件可能会出现丢失标签的情况,这将严重影响服务器控件的呈现。

三、当呈现ASP.NET服务器控件标签中的内容时,必须重写RenderContents方法。

上文介绍了WebControl类的一些基本知识。尤其是对于上文所列举的示意性代码需要重点理解。这对于实现控件呈现有着重要作用。

ASP.NET服务器控件之RenderContents的基本内容将你介绍到这里,希望对你了解ASP.NET服务器控件之RenderContents有所帮助。

【编辑推荐】

  1. ASP.NET服务器控件Render方法的使用浅析
  2. ASP.NET服务器控件开发之实现事件浅析
  3. ASP.NET服务器控件之处理回传数据浅析
  4. ASP.NET服务器控件之捕获回传事件浅析
  5. ASP.NET控件开发基础之事件处理浅析
责任编辑:仲衡 来源: 天极开发
相关推荐

2009-08-06 14:42:54

ASP.NET服务器控

2009-08-06 15:21:45

ASP.NET控件开发RenderConte

2009-08-10 14:08:15

ASP.NET服务器控ASP.NET组件设计

2011-07-12 15:03:28

2009-08-04 13:10:05

ASP.NET服务器控

2009-08-05 17:11:51

ASP.NET控件开发ASP.NET服务器控

2009-08-03 15:43:22

asp.net控件

2009-08-03 18:00:00

ASP.NET服务器控

2011-07-12 15:17:02

ASP.net服务器控件

2009-08-04 17:18:37

2009-08-10 14:25:33

ASP.NET服务器控

2009-07-30 16:52:38

复合控件ASP.NET服务器控

2009-07-28 09:46:53

ASP.NET服务器控

2009-08-04 13:39:43

ASP.NET 2.0

2009-07-27 12:56:27

控件CheckBoxLASP.NET服务器

2009-08-04 15:13:38

2009-08-07 13:56:46

ASP.NET控件开发

2009-08-06 11:24:50

ASP.NET服务器控

2009-08-01 10:07:58

ASP.NET服务器控ASP.NET

2009-08-01 20:59:08

ASP.NET服务器控ASP.NET服务器ASP.NET
点赞
收藏

51CTO技术栈公众号