首先回顾一下
Page页的生命周期

Asp.net Ajax 1.0 异步回调PreInit
Asp.net Ajax 1.0 异步回调Init
Asp.net Ajax 1.0 异步回调InitComplete
Asp.net Ajax 1.0 异步回调LoadState
Asp.net Ajax 1.0 异步回调ProcessPostData
Asp.net Ajax 1.0 异步回调PreLoad
Asp.net Ajax 1.0 异步回调Load
Asp.net Ajax 1.0 异步回调LoadComplete
Asp.net Ajax 1.0 异步回调PreRender       
Asp.net Ajax 1.0 异步回调PrepareCallback 
//如果有回调
Asp.net Ajax 1.0 异步回调
PreRenderComplete
Asp.net Ajax 1.0 异步回调SaveState
Asp.net Ajax 1.0 异步回调SaveStateComplete
Asp.net Ajax 1.0 异步回调Render

不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,在Page页最后会调用Page.RenderControl()呈现Page所有子控件流程如下

Asp.net Ajax 1.0 异步回调Page.RenderControl
Asp.net Ajax 1.0 异步回调      Control.RenderControl()
Asp.net Ajax 1.0 异步回调             Control.RenderControl(writer,
this.Adapter)
Asp.net Ajax 1.0 异步回调                   Control.RenderControlInternal()
Asp.net Ajax 1.0 异步回调                       Control.Render()   
//此时Page.Render()将其重写
Asp.net Ajax 1.0 异步回调
                            Control.RenderChildren()
Asp.net Ajax 1.0 异步回调                                  Control.RenderControlInternal()

 现在关键所在
Control.RenderControlInternal()实现如下
如果不是Asp.net Ajax处理,肯定会执行foreach依次对所有的子控件进行遍历

}


以上是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设置值  

到这一切就清晰了,当您设置了RenderPageCallback,正常的Asp.net流程就不会再走了,所有的子控件就不会被Render
在Asp.netAjax 1.0中使用

}

 

Asp.net Ajax 1.0 异步回调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   

Asp.net Ajax 1.0 异步回调<input type=\"submit\" name=\"Button1\" value=\"Button\" id=\"Button1\" />\r\n               
Asp.net Ajax 1.0 异步回调 
<input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n   

一部分是RenderPageCallback生成的

Asp.net Ajax 1.0 异步回调 52|hiddenField
Asp.net Ajax 1.0 异步回调
|__VIEWSTATE|/wEPDwUJNjg1NjA3NDcxZGRCX32AH2I/NEq+gCFrVr49kQDECw==|56
Asp.net Ajax 1.0 异步回调
|hiddenField|__EVENTVALIDATION|/wEWAwKf344xAoznisYGApKGsMIJOfjKisKPYP0O2NXUpNjnA29hMlA=|0
Asp.net Ajax 1.0 异步回调
|asyncPostBackControlIDs|||0|postBackControlIDs|||13|updatePanelIDs||tUpdatePanel1|0
Asp.net Ajax 1.0 异步回调
|childUpdatePanelIDs|||12|panelsToRefreshIDs||UpdatePanel1|2|asyncPostBackTimeout||90|12
Asp.net Ajax 1.0 异步回调
|formAction||Default.aspx|13|pageTitle||Untitled Page|


在客户端的部分Sys.WebForm._onFormSubmitCompleted()会对所有的信息以Json type:type,id:id,content:content进行封装
取出UpdatePanel,设置其innerhtml,客户端详细部分见赵老大的blogs

相关文章:

  • 2021-04-13
  • 2021-09-17
  • 2021-07-18
  • 2021-11-05
  • 2021-11-07
  • 2022-12-23
  • 2022-12-23
  • 2021-11-03
猜你喜欢
  • 2021-07-18
  • 2022-01-29
  • 2021-12-29
  • 2022-01-07
  • 2021-12-12
  • 2021-12-07
  • 2021-10-16
相关资源
相似解决方案