Asp.net Ajax 1.0 异步回调时,服务器端Render原理
时间:2010-08-31 来源:缘分星空
首先回顾一下
Page页的生命周期
Init
InitComplete
LoadState
ProcessPostData
PreLoad
Load
LoadComplete
PreRender
PrepareCallback //如果有回调
PreRenderComplete
SaveState
SaveStateComplete
Render
不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,在Page页最后会调用Page.RenderControl()呈现Page所有子控件流程如下
Control.RenderControl()
Control.RenderControl(writer,this.Adapter)
Control.RenderControlInternal()
Control.Render() //此时Page.Render()将其重写
Control.RenderChildren()
Control.RenderControlInternal()
现在关键所在
Control.RenderControlInternal()实现如下
如果不是Asp.net Ajax处理,肯定会执行foreach依次对所有的子控件进行遍历
internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
{
//正常情况如果不设置RareFields,进行默认的流程依次对所有子控件进行处理,
//如果设置RareFields,意思就是以自定义的方式改写RenderChildren
if ((this.RareFields != null) && (this.RareFields.RenderMethod != null))
{
writer.BeginRender();
//调用RenderMethod委托,Asp.net Ajax1.0在使用Control.SetRenderMethodDelegate时,对应的回调函数就是在此时处理的
this.RareFields.RenderMethod(writer, this);
writer.EndRender();
}
else if (children != null)
{
//如果不设置这个RareFieldsEnsured,会把Page里所有的控件呈现
//依次调用Control里所有子控件的RenderControl
foreach (Control control in children)
{
control.RenderControl(writer);
}
}
}
以上是Asp.net 的Render处理
肯定有人要问上面的if是干吗的,这个可是微软流的接口呀,整个asp.net ajax全靠这个接口进行处理
在Asp.netAjax1.0上,你肯定要放一个ScriptManager吧
它也是Control的子类,
在Page生命周期的OnPreRender时,它会调用
PageRequestManager.OnPreRender();
问题就在这,PageRequestManager.OnPreRender()实现如下
_owner.IPage.SetRenderMethodDelegate(RenderPageCallback);
SetRenderMethodDelegate()方法是干什么用的
在Control中,当您调用了SetRenderMethodDelegate会给Control.RareFieldsEnsured设置值
public void SetRenderMethodDelegate(RenderMethod renderMethod)
{
//使用OccasionalFields.RareField
this.RareFieldsEnsured.RenderMethod = renderMethod;
this.Controls.SetCollectionReadOnly("Collection_readonly_Codeblocks");
}
到这一切就清晰了,当您设置了RenderPageCallback,正常的Asp.net流程就不会再走了,所有的子控件就不会被Render
在Asp.netAjax 1.0中使用
private void RenderPageCallback(HtmlTextWriter writer, Control pageControl)
{
//取出当前的HtmlForm
IHtmlForm formControl = _owner.IPage.Form;
//手动设置当FormControl.RenderControl时()回调方法 ,因为这个时候Page.Controls里有子控件不会被Render啦,怎么办
//手动处理一个呗
formControl.SetRenderMethodDelegate(RenderFormCallback);
//同样,HtmlForm.RenderControl不会在Page.Controls里自动触发的
//这个时候您需要手动的RenderCtronl一下,这样才能调用RenderFormCallback
formControl.RenderControl(formWriter);
//生成客户端回调信息|asyncPostBackControlIDs
EncodeString(writer, AsyncPostBackControlIDsToken, String.Empty, GetAsyncPostBackControlIDs(false));
//生成客户端回调信息 |postBackControlIDs
EncodeString(writer, PostBackControlIDsToken, String.Empty, GetPostBackControlIDs(false));
//生成客户端回调信息 |updatePanelIDs|tUpdatePanel
EncodeString(writer, UpdatePanelIDsToken, String.Empty, GetAllUpdatePanelIDs());
//生成客户端回调信息 |childUpdatePanelIDs
EncodeString(writer, ChildUpdatePanelIDsToken, String.Empty, GetChildUpdatePanelIDs());
//生成客户端回调信息 |panelsToRefreshIDs
EncodeString(writer, UpdatePanelsToRefreshToken, String.Empty, GetRefreshingUpdatePanelIDs());
//生成客户端回调信息 |asyncPostBackTimeout
EncodeString(writer, AsyncPostBackTimeoutToken, String.Empty, _owner.AsyncPostBackTimeout.ToString(CultureInfo.InvariantCulture));
}
{
//呈现所有需要回发的的UpdatePanel
if (_updatePanelsToRefresh != null)
{
foreach (UpdatePanel panel in _updatePanelsToRefresh)
{
if (panel.Visible)
{
panel.RenderControl(_updatePanelWriter);
// 会生成如何的客户端回调信息
//169|updatePanel|UpdatePanel1|\r\n
<input type=\"submit\" name=\"Button1\" value=\"Button\" id=\"Button1\" />\r\n
<input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n
}
}
}
//依次将页面上所有控件的RenderControl,写入dummyWriter
foreach (Control control in containerControl.Controls)
{
//将整个Page页上所有的控件写入垃圾器,
//此时,这些控件Render的信息不会发送到客户端
control.RenderControl(dummyWriter);
}
注意,在RenderFormCallback时,HttpRequest会手动的Flush()将上面的信息刷加IIS
}
至于Ctronl.Render时,是如何写入HtmlTextWriter,再写入HttpWriter,
再写回HttpWorkRequest,最终刷回内核,或使用socket发送回服务器,不在本文讨论范围.......
由上可见,Asp.net Ajax,必没有使用传统的HttpRequest.Filter来处理回发信息,而是使用了Asp.net 2.0内置的方式和回调的
Asp.net Ajax回调后呈现到客户端有二个部分,一部分是由RenderFormCallback生成的如下
RenderFormCallback部分会生成如下的客户端脚本
169|updatePanel|UpdatePanel1|\r\n
<input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n
一部分是RenderPageCallback生成的
|__VIEWSTATE|/wEPDwUJNjg1NjA3NDcxZGRCX32AH2I/NEq+gCFrVr49kQDECw==|56
|hiddenField|__EVENTVALIDATION|/wEWAwKf344xAoznisYGApKGsMIJOfjKisKPYP0O2NXUpNjnA29hMlA=|0
|asyncPostBackControlIDs|||0|postBackControlIDs|||13|updatePanelIDs||tUpdatePanel1|0
|childUpdatePanelIDs|||12|panelsToRefreshIDs||UpdatePanel1|2|asyncPostBackTimeout||90|12
|formAction||Default.aspx|13|pageTitle||Untitled Page|
在客户端的部分Sys.WebForm._onFormSubmitCompleted()会对所有的信息以Json type:type,id:id,content:content进行封装
取出UpdatePanel,设置其innerhtml,客户端详细部分见赵老大的blogs
Louis Vuitton Spring Summer 2010 Embossed Monogram Single Top Handle Bag Coffee M95517 M95517-Coffee HandbagsLouis Vuitton Sobe Alligator Clutch - Blue LV M93727CBL HandbagsLV M92260 Louis Vuitton Handbags Tahitienne GM - PurpleLV N51260 Louis Vuitton LV Handbags Musette Salsa ReplicaLouis Vuitton Damier Geant Canvas Citadin Earth M93040 HandbagsLV m80701 Louis Vuitton Genois Handbags M80701Louis Vuitton Stephen Sprouse Neverfull GM Green M93703 HandbagsGucci bag 200717 in pink Gucci-5-200717P HandbagsLV M95181 Louis Vuitton Handbags Speedy 30 - GreenGucci 'babouska' evening bag 208710 CH00T 4704 Gucci-208710-CH00T-4704 HandbagsGucci leather walletSmall Red Gucci-2346 HandbagsLouis Vuitton AAAAA Grade Crocodile Veins Leather Tote - Orange HandbagsLouis Vuitton Mahina L Bag Mahogany M95999 HandbagsLouis Vuitton Nomade Leather Nomade Lockit M85388 HandbagsLouis Vuitton Monogram Mini Lin Noe M95315 HandbagsCHANEL 46570-PINK Handbags Chanel-46570-PINKGucci bag 181326-chocolate gucci-181326 Handbags09 CHANEL PARIS MOSCOW *ROMANOV IVORY 2.55* WOOL FLAP BAG 36015 - BLUE 36015blue HandbagsChanel Wallet cosmetic -pink chanel B0030 Chanel-B0030 HandbagsChanel Wallet Embossed Detail Wallet - Beige Chanel-CC1850 HandbagsLouis Vuitton Multicolor Alma Black M92646 HandbagsGucci Designers Handbags 211943FVEHG9769 gucci-211943FVEHG9769LV M95738 Louis Vuitton LV Handbags DuderanchLouis Vuitton 1:1 Grade Leather Boston Bag with Beads and Dangled Tassels - Coffee HandbagsGucci GG Fabric Handbagss G186235 Gucci-186235-CLSLouis Vuitton Damier Geant Canvas Bag M93048 HandbagsGucci G203626-Guccisima leather in Black Gucci-203626-03 HandbagsLouis Vuitton Monogram Canvas Trolley 50 Bosphore M23259 HandbagsLouis Vuitton Suhali Leather L'Epanoui GM Coffee M91857 M91857-coffee HandbagsLV N23255 Louis Vuitton LV Handbags Pegase 60Louis Vuitton A Grade Monogram Multicolore Canvas Handbags with Graffiti&Paillette - White/BlackChanel Handbags Chanel 3617-Black Chanel-3617-BlackLouis Vuitton Monogram Vernis Roses Alma MM Blue Galactic LV M93 M93725BL HandbagsLouis Vuitton Damier Canvas Berkeley-Ebony N52000 HandbagsLV M43102PL Louis Vuitton LV Handbags Speedy 25 - GrenadeMultipocket Bag - Beige on Beige chanel-25173BM HandbagsLouis Vuitton Damier Canvas Rift Damier N60009 HandbagsChanel Handbags Chanel Coco's Cabas Shopper - Gold with Black Fri Chanel-cc1730LV M92394 Louis Vuitton LV Handbags Leonorchanel Handbags Chains Large Purse - Black chanel-cc950LV M95889 Louis Vuitton LV Handbags Manon MMLV M23350 Louis Vuitton LV Handbags Satellite 75Louis Vuitton Monogram Mini Lin Manon Mini Pouch M95668 HandbagsLV M97000 Louis Vuitton Spring Summer 2009 Kalahari PM Yellow HandbagsChanel Moscow Classic Flap Bag nappa leather 35995-Pink 35995pink HandbagsChanel Patent Flap Satchel Handbags 46041 black chanel-46041Gucci Designers Handbagss G208710-black gucci-G208710-blackLouis Vuitton Monogram Canvas Keepall 60 with Shoulder Strap M41412 Handbags