服务端控件的呈现
Control类的呈现方法:
Control类的rendering(呈现)方法描述:
protected virtual void Render(HtmlTextWriter writer)
允许控件通过编写标记文本生成自身。当控件直接从Control类派生时,应该重载这个方法来生成所需的内容。
protected virtual void RenderChildren(HtmlTextWriter writer)
在HtmlTextWriter对象的流中生成控件的子控件。默认情况下按照它们加入控件的Controls集合时的顺序生成。当需要改变子控件的默认逻辑时,要重载这个方法。比如需要在两个子控件中插入一些其他文本,就要重载此方法。
public void RenderControl(HtmlTextWriter writer)
生成一个控件。Render方法的类型是受保护的。而RenderControl的类型为公用的。它允许消费(使用)控件的一个类能够生成控件。例如,当页面生成控件树时,在每个子控件上都调用RenderControl方法。控件的设计器也会在可视化设计平台上调用RenderControl方法。作为控件开发人员,需要在生成一个子控件时调用RenderControl方法。当控件的Visible属性为真时,则RenderControl实际是通过调用Render方法来实现的。
WebControl类的呈现方式:
WebControl类的rendering方法
protected virtual void AddAttributesToRender(HtmlTextWriter writer)
使控件指定名/值对,作为Html元素标签的attribute提供。在重载AddAttributesToRender时,必须调用基类中相应的方法,否则控件将会失去大量控件重要的功能。WebControl基类按照这种方式实现将会生成大量控件属性作为Html attribute。例如,WebControl生成ClientID属性作为Html的id attribute。
public virtual void RenderBeginTag(HtmlTextWriter writer)
使Web控件在输出流中写入一个开始标签。如果想对开始标签进行不同的处理(例如,如果想生成多重的开始标签<table><tr><td>),重要重载这个方法。如果控件只生成一个标签并想重载WebControl产生的默认<span>标签,应该重载TagKey或TagName属性,而不必重载RenderBeginTag方法。
protected virtual void RenderContents(HtmlTextWriter writer)
使Web控件生成控件标签的内容。默认情况下,本方法会生成子控件树。如果要在控件的标签中写入文本或其他内容,需要重载这个方法。如果要使用默认逻辑来产生子控件,需要调用基类的相应方法。
public virtual void RenderEndTag(HtmlTextWriter writer)
使web控件在输出流中写入一个结束标签。只有提供的结束标志匹配按照RenderBeginTag方法(如果控件中重载此方法)创建的标签时,才需要重载此方法。例如在RenderBeginTag中生成多个开始标签(<table><tr><td>),那么在RenderEndTag中就要生成</table></tr></td>
WebControl属性,WebControl是如何输出Html标签的,
protected virtual HtmlTextWriterTag TagKey
{
get
{
return this.tagKey;
}
}
protected virtual string TagName
{
get
{
if ((this.tagName == null) && (this.TagKey != HtmlTextWriterTag.Unknown))
{
this.tagName =”…”;
}
return this.tagName;
}
}
派生的控件如果想替换WebControl生成的默认Span标签需要重载TagKey或TagName属性。
例如,生成div标签
/// <summary>
/// 输出div标签,重载了默认的Html标签
/// </summary>
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.Div;
}
}