您的位置:首页 > 其它

Atlas 实现机制浅析 [3]

2006-03-17 11:37 351 查看
原文:http://www.blogcn.com/User8/flier_lu/blog/29042138.html

1.3 局部重绘模式的服务器端响应  

  在第一小节中,我们曾提到 ScriptManager 在重载的 Web.UI.Control.OnInit 事件中,会根据页面请求中 delta = true 是否存在,判断当前页面是否处于局部重绘模式中,并接管 LoadComplete 时间来处理此模式。相应的 OnInit 事件还会在局部重绘模式中,主动接管 Page.Render 方法的逻辑来替换完整页面刷新。

 1

protected
 
override
 
void
 OnInit(EventArgs e)

 2

23

private
 
void
 OnPagePreRenderComplete(
object
 sender, EventArgs e)

24

private
 
void
 OnPageLoadComplete(
object
 sender, EventArgs e)

 2

private
 
void
 RenderPageCallback(HtmlTextWriter writer, Control pageControl)

 2

private
 
void
 RenderFormCallback(HtmlTextWriter writer, Control containerControl)

 2

_onFormSubmitCompleted 
=
 
function
(sender, eventArgs) 

 2

private
 
void
 RenderPageCallback(HtmlTextWriter writer, Control pageControl)

 2

19

private
 
void
 OnPageError(Exception ex)

20

26

private
 
static
 
void
 OnError(
string
 errorMessage, IHttpServerUtility httpServer, IHttpResponse response)

27

<
atlas:ScriptManager 
runat
="server"
 
>

  
<
ErrorTemplate
>

    There was an error processing your action.
<
br 
/>

    
<
span 
id
="errorMessageLabel"
></
span
>

    
<
hr 
/>

    
<
button 
type
="button"
 id
="okButton"
>
OK
</
button
>

  
</
ErrorTemplate
>

</
atlas:ScriptManager
>

  而 ScriptManager.RenderErrorTemplate 方法会根据模板内容,生成名称为 __ErrorContainer 的 HTML 元素,并最终在客户端解析返回值的 _enterErrorMode 函数中进行更新。
  
  而对重绘区域进行更新的 _updatePanel 函数,将根据 deltaPanels 中给出的 ID,定位到目标的更新区域 span 标签。并将其所有子控件进行析构 (dispose) 和删除 (removeChild),并用 rendering 中返回的内容替换之。

 1

_updatePanel 
=
 
function
(panelID, rendering) 

 2

{

 3

  
var
 updatePanelElement 
=
 document.getElementById(panelID);

 4

 5

  
var
 elementsToDestroy 
=
 [];

 6

  
var
 childCount 
=
 updatePanelElement.children.length;

 7

  

 8

  
for
 (
var
 i 
=
 
0
; i 
<
 childCount; i
++


 9

  

{

10

         elementsToDestroy.add(updatePanelElement.children[i]);

11

  }

12

13

    
for
 (
var
 j 
=
 
0
; j 
<
 elementsToDestroy.length; j
++


14

    

{

15

      
if
 (elementsToDestroy[j].control) 

16

        elementsToDestroy[j].control.dispose();

17

            

18

        updatePanelElement.removeChild(elementsToDestroy[j]);

19

  }

20

21

  updatePanelElement.innerHTML 
=
 rendering;

22

}

  
  除了上述异常处理的流程外,Altas M1 还在 OnInit 方法中接管了局部重绘模式下的 IHttpContext.ApplicationInstance 对象的 PreSendRequestHeaders 和 Error 事件,分别用于处理页面重定向和全局异常的情况。具体实现机制与上述异常处理机制较为类似,这里就不一一分析了。
  
  至此,一个完整的 Altas 异步请求和局部重绘模式的流程就基本分析完成了,后面有时间将继续就 WebService 支持、数据绑定等实现进行分析,而其原理基本上都是基于之前两节所分析的模式,只不过根据具体的应用有所变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: