- ·上一篇文章:ASP.NET服务器控件之RenderContents(3)
- ·下一篇文章:ASP.NET服务器控件之RenderContents(1)
ASP.NET服务器控件之RenderContents(2)
该方法将指定样式的所有非空白元素复制到控件,但不改写该控件现有的任何样式元素。
(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)。
(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)。
