您的位置:首页 > 编程语言 > ASP

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: