当前位置:中国站长下载文章中心网页编程.NET编程 → ASP.NET服务器控件之RenderContents(2)

ASP.NET服务器控件之RenderContents(2)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 8:34:21
     该方法将指定样式的所有非空白元素复制到控件,但不改写该控件现有的任何样式元素。
  
    (7)protected override void Render(HtmlTextWriter writer);方法
  
    该方法重写了Control.Render。
  
    (8)protected virtual void RenderContents(HtmlTextWriter writer);
  
    该方法将控件的内容呈现到指定的编写器中。如果要在控件的标签中写入文本或其他内容,则需要重写该方法;如果要使用默认逻辑来呈现子控件,那么一定要调用基类中相应的方法。
  
    可能读者已经注意到WebControl基类中包括的两个方法:Render和RenderContents。根据上文所介绍的内容可知, Control基类中包括Render方法。由于WebControl类继承自Control类,因此,WebControl类中包含Render方法是无可非议的。然而,WebControl类中却有一个RenderContents方法,并且该方法与Render方法在功能、参数等方面都非常相似。那么在呈现控件过程中到底应该使用哪一个呢?
  
    实际上,在通常情况下,如果服务器控件自WebControl基类派生,那么其中的Render方法很少使用,而主要使用RenderContents方法实现控件呈现。为了说明其中的原因,我们必须了解WebControl基类中Render方法的实现逻辑。
  
    在WebControl基类中的Render方法的实现示意性代码如下所示:
  
  protected override void Render(HtmlTextWriter output)
  {
   RenderBeginTag(output);
   RenderContents(output);
   RenderEndTag(output);
  }
  
    在WebControl基类中的RenderBeginTag方法的实现示意性代码如下:
  
  public virtual void RenderBeginTag(HtmlTextWriter output)
  {
   AddAttributesToRender(output);
   HtmlTextWriterTag tagKey = TagKey;
   if(tagKey != HtmlTextWriterTag.Unknown)
   {
    output.RenderBeginTag(tagKey);
   } else {
    output.RenderBeginTag(this.TagName);
   }
  }
  
    在WebControl基类中的RenderContents方法的实现示意性代码如下:
  
  protected override void RenderContents(HtmlTextWriter output){
   //使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。
   base.Render(output);
  }
  
    分析以上代码可以得出以下结论:
  
    一、为了在由WebControl派生的类中实现控件呈现,必须重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法中的一个或者多个,而不必重写Render方法。
  
    二、重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法非常重要(请注意重写这些方法的条件及注意事项),否则服务器控件可能会出现丢失标签的情况,这将严重影响服务器控件的呈现。
  
    三、当呈现服务器控件标签中的内容时,必须重写RenderContents方法。
  
    上文介绍了WebControl类的一些基本知识。尤其是对于上文所列举的示意性代码需要重点理解。这对于实现控件呈现有着重要作用。  做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。