Atlas 实现机制浅析(三)
局部重绘模式的服务器端响应
在第一小节中,我们曾提到 ScriptManager 在重载的 Web.UI.Control.OnInit 事件中,会根据页面请求中 delta = true 是否存在,判断当前页面是否处于局部重绘模式中,并接管 LoadComplete 时间来处理此模式。相应的 OnInit 事件还会在局部重绘模式中,主动接管 Page.Render 方法的逻辑来替换完整页面刷新。
protected override void OnInit(EventArgs e)
{
// 当不处于设计模式,且控件属于某个页面时
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 += new EventHandler(this.OnPageLoadComplete);
}
// 完成前面提到的 Altas.js 和 XML 脚本的输出
_page.PreRenderComplete += new EventHandler(this.OnPagePreRenderComplete);
}
}
private void OnPagePreRenderComplete(object sender, EventArgs e)
{
// 是否在局部重绘模式中
if (_inPartialRenderingMode)
{
// 接管 Page 的 Render 方法
Page.SetRenderMethodDelegate(new RenderMethod(RenderPageCallback));
return;
}
// ...
}
在 OnPageLoadComplete 中,将遍历通过 RegisterUpdatePanel 注册到 ScriptManager 的所有 UpdatePanel,评估哪些区域是真正需要进行更新的 (UpdatePanel,评估哪些.RequiresUpdate = true),伪代码如下:
private void OnPageLoadComplete(object sender, EventArgs e)
{
for(UpdatePanel panel in _allUpdatePanels)
{
if(panel 是 Page.Form 的子控件 && panel.RequiresUpdate)
{
panel.SetPartialRenderingMode(true);
_updatePanels.Add(panel1);
}
}
}
- 本文关键词:

