Asp.net Ajax 1.0 异步回调时,服务器端Render原理1

时间:2010-03-18 11:42:50  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:>  Load   LoadComplete   PreRender   PrepareCallback //如果有回调   PreRenderComplete   SaveState   SaveStateComplete   Render      不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,   ...
  正文:首冼回顾一下
  Page页的生命周期
  
  PreInit
  Init
  InitComplete
  LoadState
  ProcessPostData
  PreLoad
  Load
  LoadComplete
  PreRender
  PrepareCallback //如果有回调
  PreRenderComplete
  SaveState
  SaveStateComplete
  Render
  
  不论是ASP/ target=_blank class=infotextkey>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中使用
  
  private void RenderPageCallback(HtmlTextWriter writer, Control pageControl)
  {
   ... 《Asp.net Ajax 1.0 异步回调时,服务器端Render原理1》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/13286.html


关键字:

关于《Asp.net Ajax 1.0 异步回调时,服务器端Render原理1》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td