Atlas 实现机制浅析(二)
【导读】与 .NET 和 Java 平台下其它 AJAX 框架相比,Altas 最大的亮点就在于与 ASP.NET 现有机制的无缝融合。通过 VS.NET 集成开发环境,使用者可以在对 js 和 AJAX 不甚了解的情况下,以非常自然的方式使用到最先进的技术。本文续第一篇,是Atlas 实现机制浅析(二)。
UpdatePanel 与局部重绘模式 (Partial Rendering Mode)
在上一节介绍 Altas 整体结构时曾经提到,可以在启用局部重绘模式的情况下,通过通过 <altas:UpdatePanel .../> 标签定义需要异步更新的范围。
我们知道,传统的 HTTP 协议应用场景中,客户端在用户点击 submit 提交 form 的时候,一个 GET/POST 请求被发送到后台服务器;服务器则根据 form 的 action 指定页面,调用相应的处理者返回 HTML 格式的文本;返回结果并最终由客户端在浏览器中绘制,通常导致浏览器一次明显的刷新。
这种模式从 Web 早期的 CGI 一直沿用到现在的 ASP.NET 中。其优点是简单易用且较为成熟,缺点则是刷新明显且速度慢。因为一个页面中可能大多数内容在此次请求中是无需改变的,而这部分冗余的内容在每次请求都会被反复传输。尤其是对一些交互性较强的页面,每个操作都沿用这个冗长的流程,响应速度和负载都是难以容忍的。期间大家也想过很多缓解方法,例如使用 iframe 等嵌入帧封装独立部件,或者在服务器端针对不同区域进行缓存等等,但因为都还是基于这个传统思路,无法从本质上解决问题。
而对遵循 AJAX 思想的 Altas 框架,则是大大迈出一步,真正实现按需出发进行重绘。
- 首先,页面在定义时可以根据逻辑被分成若干个更新区域,通过 <altas:UpdatePanel .../> 标签直接定义。
- 其次,Altas 将接管 ASP.NET 客户端的顶级 Post Back 用 form,并针对局部重绘模式加入特定的参数。
- 然后,Altas 将接管 ASP.NET 服务器端的页面重绘方法。如果是在局部重绘模式下,则对客户端请求进行解析,并判断需要对那些区域进行重绘。可以通过在 UpdatePanel 中指定重绘条件,来避免不必要的重绘操作。
最后,重绘的结果会被封装成 XML 脚本,通过异步的 XMLHTTP 方式传递会客户端。客户端 Altas 引擎对返回内容进行解析后,更新到页面的相应控件上。
整个过程完全由 Altas 自动在后台完成,不会对前台页面造成刷新或其它的影响。
接下来我们来详细了解一下,Altas 是如何完成这一奇妙的功能。
首先,在 ScriptManager 启用局部重绘模式后(ScriptManager.EnablePartialRendering = true),可以通过 UpdatePanel 定义任意多个更新区域,例如:
<atlas:UpdatePanelrunat="server"ID="UpdatePanel1"> <ContentTemplate> <strong><spanstyle="text-decoration:underline">ShippingAddress</span>:</strong> <br/> <asp:LabelID="lblFirstLineShipping"runat="server"Font-Bold="False"></asp:Label><br/> <asp:LabelID="lblSecondLineShipping"runat="server"></asp:Label><br/> <asp:LabelID="lblThirdLineShipping"runat="server"></asp:Label><br/> </ContentTemplate> </atlas:UpdatePanel> |
更新区域的实际内容,在 ContentTemplate 属性定义。UpdatePanel.ContentTemplate 是一个 ITemplate 接口类型的属性。ASP.NET 通过此接口来定义服务端控件与其子控件的关系,定义如下:
[ParseChildren(true),PersistChildren(false)] publicclassUpdatePanel:Control { [TemplateInstance(TemplateInstance.Single),PersistenceMode(PersistenceMode.InnerProperty)] publicITemplateContentTemplate{get;set;} } |
而如果希望显式指定更新的触发条件,则可以通过 Triggers 属性定义,例如下列代码指定,只有在触发了 btnTrigger 按钮的 Click 事件后,才需要对 UpdatePanel2 区域进行重绘。
<asp:Buttonrunat="server"ID="btnTrigger"Text="Trigger" onClick="btnTrigger_Click"/> < 相关新闻>>最新推荐更多>>>
|