Asp.net Ajax 1.0 异步回调时,服务器端Render原理 1
点击次数:29 次 发布日期:2008-11-26 11:08:55 作者:源代码网
|
源代码网推荐 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) 源代码网推荐 { 源代码网推荐 //正常情况如果不设置RareFields,进行默认的流程依次对所有子控件进行处理, 源代码网推荐 //如果设置RareFields,意思就是以自定义的方式改写RenderChildren 源代码网推荐 if ((this.RareFields != null) && (this.RareFields.RenderMethod != null)) //当您SetRenderMethodDelegate时,RareFieldsEnsured就有值啦 源代码网推荐 { 源代码网推荐 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中使用 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
