Asp.net Ajax 1.0 异步回调
2008-09-17 09:38
357 查看
首先回顾一下
Page页的生命周期
PreInit
Init
InitComplete
LoadState
ProcessPostData
PreLoad
Load
LoadComplete
PreRender
PrepareCallback //如果有回调
PreRenderComplete
SaveState
SaveStateComplete
Render
不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,在Page页最后会调用Page.RenderControl()呈现Page所有子控件流程如下
Page.RenderControl
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)
public void SetRenderMethodDelegate(RenderMethod renderMethod)
到这一切就清晰了,当您设置了RenderPageCallback,正常的Asp.net流程就不会再走了,所有的子控件就不会被Render
在Asp.netAjax 1.0中使用
private void RenderPageCallback(HtmlTextWriter writer, Control pageControl)
private void RenderFormCallback(HtmlTextWriter writer, Control containerControl)
至于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 type=\"submit\" name=\"Button1\" value=\"Button\" id=\"Button1\" />\r\n
<input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n
一部分是RenderPageCallback生成的
52|hiddenField
|__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
Page页的生命周期
PreInit
Init
InitComplete
LoadState
ProcessPostData
PreLoad
Load
LoadComplete
PreRender
PrepareCallback //如果有回调
PreRenderComplete
SaveState
SaveStateComplete
Render
不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,在Page页最后会调用Page.RenderControl()呈现Page所有子控件流程如下
Page.RenderControl
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)
public void SetRenderMethodDelegate(RenderMethod renderMethod)
到这一切就清晰了,当您设置了RenderPageCallback,正常的Asp.net流程就不会再走了,所有的子控件就不会被Render
在Asp.netAjax 1.0中使用
private void RenderPageCallback(HtmlTextWriter writer, Control pageControl)
private void RenderFormCallback(HtmlTextWriter writer, Control containerControl)
至于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 type=\"submit\" name=\"Button1\" value=\"Button\" id=\"Button1\" />\r\n
<input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n
一部分是RenderPageCallback生成的
52|hiddenField
|__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
相关文章推荐
- Asp.net Ajax 1.0 异步回调时,服务器端Render原理(原创)
- Asp.net Ajax 1.0 异步回调时,服务器端Render原理
- Ajax实例:ASP.NET 异步回调开发重构
- ASP.NET AJAX 1.0 正式版发布
- ASP.NET AJAX 1.0 正式版分析
- 微软发布了ASP.NET AJAX 1.0正式版
- ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析
- 为ASP.NET AJAX 1.0 Beta补充trace和dump功能
- 在虚拟主机上部署ASP.NET AJAX 1.0 Beta的程序集
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法
- asp.net ajax 1.0中很好用的ajaxtoolkit精选介绍(1)
- ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用
- ASP.NET AJAX RC1.0 的一点变化
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(3):保持用户上下文
- Asp.net 登陆页面的Ajax异步身份验证的实现
- ASP.NET AJAX中的异步Web Services调用
- ASP.NET AJAX中的异步Web Services调用
- ASP.NET AJAX RC1.0 的一点变化
- 我的AjaxPage对象(Asp.NET 1.1)-借用2.0的Callback实现无刷新回调
- 稳扎稳打Silverlight(2) - 1.0实例之支持录音和回放的钢琴(Silverlight+ASP.NET AJAX+DLINQ)