Atlas 实现机制浅析(三)

来源:网络收集 责任编辑:栏目编辑 发表时间:2013-07-01 09:48 点击:

【导读】与 .NET 和 Java 平台下其它 AJAX 框架相比,Altas 最大的亮点就在于与 ASP.NET 现有机制的无缝融合。通过 VS.NET 集成开发环境,使用者可以在对 js 和 AJAX 不甚了解的情况下,以非常自然的方式使用到最先进的技术。本文是Atlas 实现机制浅析(三),为此系列之末篇。

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

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

protectedoverridevoidOnInit(EventArgse)

{

//当不处于设计模式,且控件属于某个页面时

if(!DesignMode&&(_page!=null))

{

//判断页面中是否只有一个ScriptManager实例,否则抛出异常

//如果页面请求中delta属性为true则处于重绘模式

if(_page.Request.Headers["delta"]=="true"[img]/images/wink.gif[/img]

{

_inPartialRenderingMode=true;//处于重绘模式

_page.TraceEnabled=false;//关闭trace支持

//根据每个UpdatePanel的重绘状态,返回实际的重绘结果

_page.LoadComplete+=newEventHandler(this.OnPageLoadComplete);

}

//完成前面提到的Altas.js和XML脚本的输出

_page.PreRenderComplete+=newEventHandler(this.OnPagePreRenderComplete);

}

}

privatevoidOnPagePreRenderComplete(objectsender,EventArgse)

{

//是否在局部重绘模式中

if(_inPartialRenderingMode)

{

//接管Page的Render方法

Page.SetRenderMethodDelegate(newRenderMethod(RenderPageCallback));

return;

}

//...

}



在 OnPageLoadComplete 中,将遍历通过 RegisterUpdatePanel 注册到 ScriptManager 的所有 UpdatePanel,评估哪些区域是真正需要进行更新的 (UpdatePanel,评估哪些.RequiresUpdate = true),伪代码如下:
privatevoidOnPageLoadComplete(objectsender,EventArgse)

{

for(UpdatePanelpanelin_allUpdatePanels)

{

if(panel是Page.Form的子控件&&panel.RequiresUpdate)

{

panel.SetPartialRenderingMode(true);

_updatePanels.Add(panel1);

}

}

}

而 RenderPageCallback 中,则将取代 Page.Render 的原本逻辑,根据整理出的 _updatePanels 列表中的区域进行重绘。返回的内容将是一个 XML 格式的文档,包括重绘的内容(<rendering>、重绘的区域(<deltaPanels>以及相关 XML 脚本(<xmlScript>等。实现的伪代码如下:

privatevoidRenderPageCallback(HtmlTextWriterwriter,ControlpageControl)

{

Pagepage=(Page)pageControl;

HttpResponseresponse=page1.Response;

//关闭HTML缓存,设置返回文档类型为text/xml

response.Cache.SetCacheability(HttpCacheability.NoCache);

response.ContentType="text/xml";

//输出HTML头内容

writer.Write("<delta><rendering>"[img]/images/wink.gif[/img];

page.Header.RenderControl(writer);

//输出Form成员的内容

HtmlFormform=page.Form;

form.SetRenderMethodDelegate(newRenderMethod(this.RenderFormCallback));

form.RenderControl(writer);

writer.Write("</rendering>"[img]/images/wink.gif[/img];

//输出重绘UpdatePanel的ID列表

writer.Write("<deltaPanels>"[img]/images/wink.gif[/img];

for(UpdatePanelpanelin_updatePanels)

{

//添加逗号分隔符

writer.Write(updatePanels.ClientID);

}

writer.Write("</deltaPanels>"[img]/
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1