Asp.net中所有的控件都是从System.Web.UI.Control类,在control类中定义了三个与呈现有关的方法,分别是Render方法,RenderChildren方法和RenderControl方法.其中RenderControl方法是public的方法,先看看这三个方法的实现:
Public void RenderControl(HtmlTextWriter writer)
{
//判断Visible属性是否为真,如果是,则调用Render方法呈现控件,否则不呈现控件
if(Visible)
{
Render(writer);
}
}
Protected virtual void Render(HtmlTextWriter writer)
{
//在这里写呈现控件本身的代码
…….
//调用RenderChildren方法呈现该控件的子控件
RenderChildren(writer);
}
Protected virtual void RenderChildren(HtmlTextWriter writer)
{
//循环调用每个子控件中的RenderControl方法呈现子控件,递归实现呈现整个页面的控件树
foreach(Control c in Controls)
{
c.RenderControl(writer);
}
}
RenderControl方法用于供外部类进行调用,以生成控件,如父控件调用子控件的Rendercontrol方法.在RenderControl方法只是作了是否显示该控件的判断,如果显示则调用控件的被保护方法Render.
Render方法是呈现控件的核心方法,在现实性自定义控件中,我们一般都是通过重写Render方法来呈现控件的,如果控件是一个容器控件,就要重写RenderChildren方法来呈现子控件.
所有的服务端控件都是从System.Web.UI.WebControl中派生.而WebControl又从Control中派生,所以WebControl具有上述的三个方法,但是又增加了几个方法,它把Render方法又细分成三个方法:RenderBgeginTag,RenderContents,RenderEndTag.Render的实现代码如下:
Protected override void Render(HtmlTextWriter writer)
{
//呈现开始标签
RenderBgeginTag(writer);
//呈现标签的内容
RenderContents(writer);
//呈现结束标签
RenderEndTag(writer);
}
Public virtual void RenderBeginTag(HtmlTextWriter writer)
{
//调用AddAttributesToRender方法,添加标签的属性
AddAttributesToRender(writer);
//判断呈现的标签是否为已知的标签;
HtmlTextWriterTag tagkey=TagKey;
If (tagkey!=HtmlTextWriterTag.Unknown)
{
Writer.RenderBeginTag(tagkey);
}
Else
{
//未知标签,则使用指定的标签名TagName属性
Writer.RenderBeginTag(this.TagName);
}
}
Protected virtual void RenderContents(HtmlTextWriter writer)
{
//如果要呈现子控件,就要调用基类的Render方法
base.Render(writer);
}
看这几个方法,我觉得好象没有多大的必要把render方法分解成三个方法,这样仅对于一呈现单个标签的控件才有意义,对于复合的控件似乎没什么意义,还增加了复杂度.
总结:
1.如果从Control中派生,则应重载Render()方法呈现控件.如果控件是一个容器控件,则应在render方法中调用基类的base.RenderChildren()方法,呈现子控件.
2.如果从Webcontrol类中派生,分两种情况,一种是利用TagKey属性生成输出的html标签,这时应重载RenderContents()方法来呈现控件.第二种是不想呈现默认的的用TagKey生成的html标签,这时应重载Render()方法来呈现控件,如下代码所示:
Protected virtual void Render(HtmlTextWriter writer)
{
//在这里写呈现控件本身的代码
AddAttributesToRender(writer);
RenderContents(writer);
}
Protected virtual void RenderContents(HtmlTextWriter writer)
{
//呈现本控件代码
….
//如果要呈现子控件,就要调用基类的Render方法
base.Render(writer);
}
3.如果从Webcontrol类中派生,并且该控件是一个容器控件,则应在RenderContents中调用base.Render()方法,以呈现子控件.
分享到:
相关推荐
这个方法是官方的帮助文档然后别人翻译的版本, 不过现在KeyShot Network Rendering都是中文的了,对于大多数人的难度也下降不少。 在使用前请保证需要使用KeyShot Network Rendering的电脑在同一局域网下。
StageFright_Video Rendering
Direct3D Rendering Cookbook
Rendering渲染工具 1 1 1
ShaderX7 - Advanced Rendering Techniques
Real-Time Graphics Rendering Engine
Realistic and Fast Cloud Rendering
volume rendering gpu.pdf
Crafting a perfect rendering in 3D software means nailing all the details. And no matter what software you use, your success in creating realistic-looking illumination, shadows and textures depends on...
Real-Time Rendering, Fourth Edition 实时渲染最新版 第四版PDF,下载地址见文档....
The OpenGL Rendering Pipeline, CSE 781 Winter 2010.
This book on rendering considers REAL rendering systems,integrating complex geometry, procedural shading, and globalillumination. It is edited by Ian Stephenson, but each chapter has beenwritten by a ...
经典书籍Digital Lighting and Rendering的第三版。排版比较渣,但是好过没有吧!
Digital Lighting and Rendering 2nd Edition. pdf format
Real Time Rendering !!!
Real-Time Rendering Third Edition by Tomas Akenine-Moller Eric Haines Naty Hoffman Copyright © 2008 by A K Peters, Ltd.
浏览器最核心的部分是渲染引擎(Rendering Engine),我们一般习惯称之为“浏览器内核”,其负责解析网页语法(如HTML、JavaScript)并渲染、展示网页。因此,所谓的浏览器内核 通常也就是指浏览器所采用的渲染引擎...
Advanced Animation and Rendering Techniques There is link address in it.
Realtime Rendering, 3D, CG, Graphics Realtime Rendering 3ed 第三版 pdf 英文版