All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
PHP的服务器Apache中httpd.conf 的中文详解_[PHP教程]
ASP.NET技巧:一个在移动设备中获取路径的方法_.net资料_编程技术
新手入门:PHP网站开发中常见问题汇总_php资料_编程技术
向上循环滚动带停留的js特效_JavaScript技术_编程技术
学习动态网页技术PHP中错误处理的一些方法_php资料_编程技术
visual c++在windows中的编程思想
常用技巧:用PHP控制您的浏览器cache_php资料_编程技术
使用ASP.NET,AJAX框架扩展HTML,Map控件_.net资料_编程技术
PHPUnit袖珍指南之自动测试_php资料_编程技术
C#中GDI+变形的矩阵表示形式
Reading number is top 10 pictures
Ashlynn Brooke show proud chest measurement2
Summer is most suitable for young people to travel in China10
史上最大的哺乳动物迁移
From China fortress sora aoi1
传奇套装
The money of more than 100 countries and regions13
The little girl with long hair2
开始让人感动,后来......
The real super beauty5
清扫五脏垃圾,我有绝招
Download software ranking
Proficient in JavaScript
Ashlynn Video2
1400篇各类破解文章
Boxer Classic video2
WebService在.NET中的实战应用教学视频 → 第1集
Kung.Fu.Panda.2
Boxer's Top ten classic battle8
Eclipse-CALMSANNY (second edition)
Dance with duck(male prostitution)
Rio big adventure
delv published in(发表于) 2014/1/27 6:45:55 Edit(编辑)
.net组件开发系列(五)之深入理解控件的呈现原理_[Asp.Net教程]

.net组件开发系列(五)之深入理解控件的呈现原理_[Asp.Net教程]

.net组件开发系列(五)之深入理解控件的呈现原理_[Asp.Net教程]

首言:
ASP.NET控件基本上都是继承Framework 已有三个基类,Control,WebControl,CompositeControl下面我就各个基类的呈现方法
讲述Control,WebControl, CompositeControl各自的呈现过程。


第一个:Control呈现过程。


在Control所继承的控件的输出流程:


在正常的控件呈现输出(就是说不是ajax控件里,在ajax会打乱此图)中,它是一个循环调用的过程,看看下面的图就知道了。


现在来分析分析其实现过程,在Render方法中调用另外一个名为RenderChildren的受保护成员,


该方法接收服务器控件内容的 HtmlTextWriter对象.



protected internal virtual void Render(HtmlTextWriter writer)
{
this.RenderChildren(writer);
}



protected internal virtual void RenderChildren(HtmlTextWriter writer)
{
/**//*
在这里this.occasionalFields中,它实现了OccasionalFields类,此类是一个sealed类,也就是一个不可继承的类,在其类中有一个Controls的public属性,返回的是一个控件集(ControlCollection)
在此处是用于维护其子控件列表的集合容器。


*/
ICollection children = (this._occasionalFields == null) ? null : ((ICollection) this._occasionalFields.Controls);


this.RenderChildrenInternal(writer, children);
}



在此,我们什么时候给了this._occasionalFields赋值了呢。赋了什么值呢。当加入到控件树上时(使用了findControl查找控件),它会调用一个



private void EnsureNamedControlsTable
方法(这个方法在findControl中调用)去确保所有控件都被正确加载完成。
然后将其填充在一个控件集中
this.FillNamedControlsTable(this, this._occasionalFields.Controls);,
从这里开始注意了,Ajax异步回调与正常输出的控件是从这里开始分岐的。
1internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
2{
3/**//*
4this.RareFields如果设置这个参数,意谓着以自定义的方式去改写RenderChildern
5没有的话,将进行默态的流程对所有的子控件进行处理。
6
7*/
8 if ((this.RareFields != null) && (this.RareFields.RenderMethod != null))
9{
10 /**//*调用RenderMethod委托,Asp.net Ajax在使用Control.SetRenderMethodDelegate时,对应的回调函数就是在此时处理的
11关于ajax的控件程现流程详见: http://www.cnblogs.com/liuxu-wxy/archive/2007/04/25/727346.html
12
13 */
14 writer.BeginRender();
15 this.RareFields.RenderMethod(writer, this);
16 writer.EndRender();
17 }
18 else if (children != null)
19{
20 //如果不设置这个RareFieldsEnsured,会把所有的控件呈现
21 //依次调用Control里所有子控件的RenderControl
22 foreach (Control control in children)
23 {
24 control.RenderControl(writer);//完成子控件的呈现过程
25 }
26 }
27}
28

接下来就是真正呈现过程的入口方法
//该方法为入口方法
public virtual void RenderControl(HtmlTextWriter writer)
{
this.RenderControl(writer, this.Adapter);
}



下面这段代码,这个是一个过渡代码,其中的this.flags[0x10]没有搞明白是什么一回事,但不要紧。
它都会去调用 RenderControlInternal方法
RenderControlInternal代码段
1protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
2{
3 if (!this.flags[0x10] && !this.flags[0x200])
4 {
5 HttpContext context = (this.Page == null) ? null : this.Page._context;
6 if ((context != null) && context.TraceIsEnabled)
7 {
8 int bufferedLength = context.Response.GetBufferedLength();
9 this.RenderControlInternal(writer, adapter);
10 int num2 = context.Response.GetBufferedLength();
11 context.Trace.AddControlSize(this.UniqueID, num2 - bufferedLength);
12 }
13 else
14 {
15 this.RenderControlInternal(writer, adapter);
16 }
17 }
18}
19
下面代码。控件是否有相关的呈现适配器,有的话就适配器调用适配器的相关呈现方法
private void RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
{
if (adapter != null)
{
//调用相关的适配器方法
adapter.BeginRender(writer);
adapter.Render(writer);
adapter.EndRender(writer);
}
else
{
this.Render(writer);
}
}



理解就是:
1.控件开始呈现
2.控件是否有相关的呈现适配器,有的话就适配器调用适配器的相关呈现方法
3.呈现子控件
4.完成控件呈现



第二个:WebControl呈现过程


WebControl:在Control的基础上增加了Style,呈现方面就是在Render(HtmlTextWriter writer) 方法中扩展了三个呈现方法,增加一个属性呈现方法


流程图如下:



伪代码如下:



public virtual void RenderBeginTag(HtmlTextWriter writer)
{
this.AddAttributesToRender(writer);
//呈现Tag开始标记
}


protected override void Render(HtmlTextWriter writer)
{
//重写了Control的Render方法并增加了三个扩展方法
this.RenderBeginTag(writer);
this.RenderContents(writer);
this.RenderEndTag(writer);
}
protected internal virtual void RenderContents(HtmlTextWriter writer)
{
//调用Control的呈现
base.Render(writer);
}


public virtual void RenderEndTag(HtmlTextWriter writer)
{
//呈现结束标记
}


protected virtual void AddAttributesToRender(HtmlTextWriter writer)
{
//呈现Attribute
}



第三个:CompositeControl呈现过程


CompositeControl类是一个抽象类,为自定义控件提供命名容器和控件设计器功能,该自定义控件包含全部子控件或使用其他控件功能。此类由Login 和Wizard 等控件继承


复合控件类必须派生自System.Web.UI.WebControls.CompositeControl类。这一点与ASP.NET 1.x环境下开发复合控件有些不同。在ASP.NET 1.x中,复合控件必须实现System.Web.UI.INamingContainer接口。然而,在ASP.NET 2.0下,复合控件类的基类则发生了变化


public abstract class CompositeControl : WebControl, INamingContainer, ICompositeControlDesignerAccessor
其余使用以后再讲,今天主要是讲其呈现过程;


CompositeControl 重写了WebControl的Render(HtmlTextWriter writer),增加了设计时支持以创建子控件


protected internal override void Render(HtmlTextWriter writer)
{
//如果在设计时,创建子控件,也就是在设计时增加友好体验
if (DesignMode)
this.EnsureChildControls();
base.Render(writer);
}


来源:suiqirui19872005的cnblogs







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.