了解使用 ASP.NET AJAX 的部分页面更新

作者 :Scott Cate

也许 ASP.NET AJAX 扩展最明显的功能是,无需对服务器执行完全回发,无需代码更改和最少的标记更改,即可执行部分或增量页面更新。 优点广泛 – 多媒体 ((如 Adobe Flash 或 Windows Media) )的状态保持不变,带宽成本降低,客户端不会遇到通常与回发相关的闪烁。

简介

Microsoft 的 ASP.NET 技术带来了面向对象的事件驱动的编程模型,并将其与编译代码的优势结合在一起。 但是,其服务器端处理模型在技术中存在几个固有的缺点:

  • 页面更新需要往返于服务器,这需要页面刷新。
  • 往返不会保留由 Javascript 或其他客户端技术 ((例如 Adobe Flash) ) 生成的任何效果
  • 在回发期间,Microsoft Internet Explorer 以外的浏览器不支持自动还原滚动位置。 即使在 Internet Explorer 中,页面刷新时仍会闪烁。
  • 回发可能涉及大量带宽,因为__VIEWSTATE窗体字段可能会增大,尤其是在处理 GridView 控件或中继器等控件时。
  • 没有统一的模型可用于通过 JavaScript 或其他客户端技术访问 Web 服务。

输入 Microsoft ASP.NET AJAX 扩展。 AJAX 表示 A 同步J avaScript A nd X ML,是一个集成框架,用于通过跨平台 JavaScript 提供增量页面更新,由包含 Microsoft AJAX 框架的服务器端代码和一个名为 Microsoft AJAX 脚本库的脚本组件组成。 ASP.NET AJAX 扩展还为通过 JavaScript 访问 ASP.NET Web 服务提供跨平台支持。

本白皮书检查部分页面更新 ASP.NET AJAX 扩展的功能,其中包括 ScriptManager 组件、UpdatePanel 控件和 UpdateProgress 控件,并考虑应或不应使用它们的情况。

本白皮书基于 Visual Studio 2008 的 Beta 2 版本和 .NET Framework 3.5,后者将 ASP.NET AJAX 扩展集成到基类库 (,其中它以前是可用于 ASP.NET 2.0) 的加载项组件。 本白皮书还假定你使用的是 Visual Studio 2008,而不是 Visual Web Developer Express Edition;引用的某些项目模板可能不适用于 Visual Web Developer Express 用户。

分页汇报

也许 ASP.NET AJAX 扩展最明显的功能是,无需对服务器执行完全回发,无需代码更改和最少的标记更改,即可执行部分或增量页面更新。 优点是广泛的 - 多媒体 ((如 Adobe Flash 或 Windows Media) )的状态保持不变,带宽成本降低,并且客户端不会遇到通常与回发相关的闪烁。

将部分页面呈现集成的功能集成到 ASP.NET 中,只需对项目进行最少的更改。

演练:将部分呈现集成到现有项目中

  1. 在 Microsoft Visual Studio 2008 中,通过转到“文件>-新建>-网站”并从对话框中选择“ASP.NET 网站”,创建新的 ASP.NET 网站项目。 可以随意命名它,并且可以将其安装到文件系统或 Internet Information Services (IIS) 。
  2. 将显示包含基本 ASP.NET 标记 (服务器端窗体和 @Page 指令) 的空白默认页。 将名为 的 Label1 Label 和名为 Button1 的 Button 拖放到窗体元素内的页面上。 你可以将其文本属性设置为任何你喜欢的文本属性。
  3. 在“设计”视图中,双击 Button1 以生成代码隐藏事件处理程序。 在此事件处理程序中,将 设置为 Label1.Text “你单击了按钮! .

列表 1:启用部分呈现之前 default.aspx 的标记

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
 <title>Untitled Page</title>
 </head>
 <body>
 <form id="form1" runat="server">
 <div>
 <asp:Label ID="Label1" runat="server" Text="This is a label!"></asp:Label>
 <asp:Button ID="Button1" runat="server" Text="Click Me" OnClick="Button1_Click" />
 </div>
 </form>
 </body>
</html>

清单 2:default.aspx.cs 中 (剪裁) 的代码隐藏

public partial class _Default : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "You clicked the button!";
    }
}
  1. 按 F5 启动网站。 Visual Studio 将提示你添加web.config文件以启用调试;这样做。 单击按钮时,请注意页面会刷新以更改标签中的文本,并且重新绘制页面时会短暂闪烁。
  2. 关闭浏览器窗口后,返回到 Visual Studio 和标记页。 在 Visual Studio 工具箱中向下滚动,找到标记为“AJAX 扩展”的选项卡。 (如果由于使用的是较旧版本的 AJAX 或 Atlas 扩展而没有此选项卡,请参阅本白皮书后面有关注册 AJAX 扩展工具箱项的演练,或者使用可从网站) 下载的 Windows Installer 安装当前版本。

显示已选择名为“A J A X Estensions 和脚本管理器”的选项卡的屏幕截图。

(单击以查看全尺寸图像)

  1. 已知问题:如果将 Visual Studio 2008 安装到已安装 Visual Studio 2005 的计算机上,而该计算机已安装了 ASP.NET 2.0 AJAX 扩展,则 Visual Studio 2008 将导入 AJAX 扩展工具箱项。 可以通过检查组件的工具提示来确定是否是这种情况;应为版本 3.5.0.0。 如果使用的是版本 2.0.0.0,则表示你已导入旧工具箱项,并且需要使用 Visual Studio 中的“选择工具箱项”对话框手动导入它们。 无法通过设计器添加版本 2 控件。

  2. <asp:Label> 标记开始之前,创建一行空格,然后双击工具箱中的 UpdatePanel 控件。 请注意,页面顶部包含一个新 @Register 指令,指示应使用 asp: 前缀导入 System.Web.UI 命名空间中的控件。

  3. 将结束 </asp:UpdatePanel> 标记拖过 Button 元素的末尾,使元素格式良好,并包装标签和 Button 控件。

  4. 在开始 <asp:UpdatePanel> 标记之后,开始打开一个新标记。 请注意,IntelliSense 会提示两个选项。 在本例中,请创建标记 <ContentTemplate> 。 请务必将此标记包装在“标签”和“按钮”周围,以便标记格式正确。

屏幕截图显示一个 s p 更新面板标记,后跟一个内容模板标记。

(单击以查看全尺寸图像)

  1. 在 元素内的 <form> 任意位置,通过双击 ScriptManager 工具箱中的项来包括 ScriptManager 控件。
  2. <asp:ScriptManager>编辑 标记,使其包含 属性 EnablePartialRendering= true

列表 3:已启用部分呈现的 default.aspx 的标记

<%@ Page Language="C#" AutoEventWireup="true"
 CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
 PublicKeyToken=31bf3856ad364e35"
 Namespace="System.Web.UI" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC
 "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
 <title>Untitled Page</title>
 </head>
 <body>
 <form id="form1" runat="server">
 <asp:ScriptManager EnablePartialRendering="true"
 ID="ScriptManager1" runat="server"></asp:ScriptManager>
 <div>
 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
 <ContentTemplate>
 <asp:Label ID="Label1" runat="server"
 Text="This is a label!"></asp:Label>
 <asp:Button ID="Button1" runat="server"
 Text="Click Me" OnClick="Button1_Click" />
 </ContentTemplate>
 </asp:UpdatePanel>
 </div>
 </form>
 </body>
</html>
  1. 打开web.config文件。 请注意,Visual Studio 已自动向 System.Web.Extensions.dll 添加了编译引用。

  2. Visual Studio 2008 中的新增功能:ASP.NET 网站项目模板附带的web.config自动包含对 ASP.NET AJAX 扩展的所有必要引用,并包含配置信息的注释部分,这些部分可以取消注释以启用其他功能。 安装 ASP.NET 2.0 AJAX 扩展时,Visual Studio 2005 具有类似的模板。 但是,在 Visual Studio 2008 中,AJAX 扩展默认选择退出 (也就是说,它们默认被引用,但可以作为引用) 删除。

显示选择了“无标题页”浏览器和默认记事本的屏幕截图。

(单击以查看全尺寸图像)

  1. 按 F5 启动网站。 请注意,无需更改源代码即可支持部分呈现 - 只更改了标记。

启动网站时,应会看到部分呈现现已启用,因为单击按钮时不会闪烁,页面滚动位置也不会发生任何更改, (此示例未证明) 。 如果在单击按钮后查看页面的呈现源,它将确认实际上未发生回退 - 原始标签文本仍然是源标记的一部分,并且标签已通过 JavaScript 进行了更改。

Visual Studio 2008 似乎没有附带用于 ASP.NET AJAX-Enabled网站的预定义模板。 但是,如果安装了 Visual Studio 2005 和 ASP.NET 2.0 AJAX 扩展,则此类模板在 Visual Studio 2005 中可用。 因此,配置网站并从AJAX-Enabled网站模板开始可能更简单,因为模板应包含完全配置的web.config文件, (支持所有 ASP.NET AJAX 扩展,包括 Web 服务访问和 JSON 序列化 - JavaScript 对象表示法) ,并在main Web Forms页中包含 UpdatePanel 和 ContentTemplate。 使用此默认页面启用部分呈现非常简单,只需重温本演练的步骤 10 并将控件拖放到页面上即可。

ScriptManager 控件

ScriptManager 控件参考

Markup-Enabled属性:

属性名称 类型 说明
AllowCustomErrors-Redirect Bool 指定是否使用 web.config 文件的自定义错误部分来处理错误。
AsyncPostBackError-Message 字符串 获取或设置在引发错误时发送到客户端的错误消息。
AsyncPostBack-Timeout Int32 获取或设置客户端应等待异步请求完成的默认时间量。
EnableScript-Globalization Bool 获取或设置是否启用脚本全球化。
EnableScript-Localization Bool 获取或设置是否启用脚本本地化。
ScriptLoadTimeout Int32 确定将脚本加载到客户端所允许的秒数
ScriptMode 枚举 (自动、调试、发布、继承) 获取或设置是否呈现脚本的发布版本
ScriptPath 字符串 获取或设置要发送到客户端的脚本文件位置的根路径。

Code-Only属性:

属性名称 类型 说明
AuthenticationService AuthenticationService-Manager 获取有关将发送到客户端的 ASP.NET 身份验证服务代理的详细信息。
IsDebuggingEnabled Bool 获取是否启用脚本和代码调试。
IsInAsyncPostback Bool 获取页面当前是否处于异步回发请求中。
ProfileService ProfileService-Manager 获取有关将发送到客户端 ASP.NET 事件探查服务代理的详细信息。
脚本 集合<脚本参考> 获取将发送到客户端的脚本引用的集合。
服务 集合<服务参考> 获取将发送到客户端的 Web 服务代理引用的集合。
SupportsPartialRendering Bool 获取当前客户端是否支持部分呈现。 如果此属性返回 false,则所有页面请求都将是标准回发。

公共代码方法:

“方法名称” 类型 说明
SetFocus (字符串) Void 请求完成时,将客户端的焦点设置为特定控件。

标记后代:

标记 说明
<AuthenticationService> 向 ASP.NET 身份验证服务提供有关代理的详细信息。
<ProfileService> 向 ASP.NET 分析服务提供有关代理的详细信息。
脚本<> 提供其他脚本引用。
<asp:ScriptReference> 表示特定的脚本引用。
<服务> 提供将生成代理类的其他 Web 服务引用。
<asp:ServiceReference> 表示特定的 Web 服务引用。

ScriptManager 控件是 ASP.NET AJAX 扩展的基本核心。 它提供对脚本库的访问 (包括广泛的客户端脚本类型系统) ,支持部分呈现,并为其他 ASP.NET 服务 ((如身份验证和分析)以及其他 Web 服务) 提供广泛的支持。 ScriptManager 控件还为客户端脚本提供全球化和本地化支持。

提供替代脚本和补充脚本

虽然 Microsoft ASP.NET 2.0 AJAX 扩展将调试版和发布版中的整个脚本代码作为资源嵌入在引用程序集中,但开发人员可以自由地将 ScriptManager 重定向到自定义脚本文件,以及注册其他必要的脚本。

若要替代通常包含的脚本 ((例如支持 Sys.WebForms 命名空间和自定义键入系统) 的脚本)的默认绑定,可以注册 ResolveScriptReference ScriptManager 类的事件。 调用此方法时,事件处理程序有机会更改有关脚本文件的路径;然后,脚本管理器会将脚本的不同或自定义副本发送到客户端。

此外,可以通过编程方式或通过标记包含由 ScriptReference 类) 表示的脚本引用 (。 为此,请以编程方式修改ScriptManager.Scripts集合,或在 标记下<Scripts>包括<asp:ScriptReference>标记,该标记是 ScriptManager 控件的第一级子级。

UpdatePanel 的自定义错误处理

尽管更新由 UpdatePanel 控件指定的触发器处理,但对错误处理和自定义错误消息的支持由页面的 ScriptManager 控件实例处理。 这是通过向页面公开事件来完成的, AsyncPostBackError该页面随后可以提供自定义异常处理逻辑。

通过使用 AsyncPostBackError 事件,可以指定 AsyncPostBackErrorMessage 属性,这会导致在回调完成后引发警报框。

还可以使用客户端自定义,而不是使用默认警报框;例如,你可能想要显示自定义 <div> 元素,而不是默认的浏览器模式对话框。 在这种情况下,可以在客户端脚本中处理错误:

列表 5:用于显示自定义错误的客户端脚本

<script type= text/javascript >
 <!--
 Sys.WebForms.PageRequestManager.getInstance().add_EndRequest(Request_End);
 function Request_End(sender, args)
 {
 if (args.get_error() != undefined)
 {
 var errorMessage =  ;
 if (args.get_response().get_statusCode() ==  200 )
 {
 errorMessage = args.get_error().message;
 }
 else
 {
 // the server wasn't the problem...
 errorMessage =  An unknown error occurred... ;
 }
 // do something with the errorMessage here.
 // now make sure the system knows we handled the error.
 args.set_errorHandled(true);
 }
 }
 // -->
</script>

很简单,上述脚本在异步请求完成时向客户端 AJAX 运行时注册回调。 然后,它会检查是否报告了错误,如果是,则处理错误的详细信息,最后向运行时指示错误是在自定义脚本中处理的。

全球化和本地化支持

ScriptManager 控件为脚本字符串和用户界面组件的本地化提供广泛的支持;但是,该主题超出了本白皮书的范围。 有关详细信息,请参阅白皮书《ASP.NET AJAX 扩展中的全球化支持》。

UpdatePanel 控件

UpdatePanel 控件参考

Markup-Enabled属性:

属性名称 类型 说明
ChildrenAsTriggers bool 指定子控件是否在回发时自动调用刷新。
RenderMode 枚举 (块、内联) 指定内容的直观呈现方式。
UpdateMode enum (Always、Conditional) 指定在部分呈现期间是否始终刷新 UpdatePanel,或者仅在命中触发器时刷新 UpdatePanel。

Code-Only属性:

属性名称 类型 说明
IsInPartialRendering bool 获取 UpdatePanel 是否支持对当前请求进行部分呈现。
ContentTemplate ITemplate 获取更新请求的标记模板。
ContentTemplateContainer 控制 获取更新请求的编程模板。
触发器 UpdatePanel - TriggerCollection 获取与当前 UpdatePanel 关联的触发器列表。

公共代码方法:

“方法名称” 类型 说明
Update () Void 以编程方式汇报指定的 UpdatePanel。 允许服务器请求触发其他未触发的 UpdatePanel 的部分呈现。

标记后代:

标记 说明
<ContentTemplate> 指定要用于呈现部分呈现结果的标记。 asp:UpdatePanel 的 <子级>。
<触发器> 指定与更新此 UpdatePanel 关联的 n 个控件的集合。 asp:UpdatePanel 的 <子级>。
<asp:AsyncPostBackTrigger> 指定一个触发器,该触发器调用给定 UpdatePanel 的部分页面呈现。 这可以是(也可能不是)作为有关 UpdatePanel 的后代的控件。 细化到事件名称。触发器的子级<>。
<asp:PostBackTrigger> 指定导致整个页面刷新的控件。 这可以是(也可能不是)作为有关 UpdatePanel 的后代的控件。 细化到 对象。 触发器的子级<>。

控件 UpdatePanel 是分隔将参与 AJAX 扩展的部分呈现功能的服务器端内容的控件。 可以位于页面上的 UpdatePanel 控件数量没有限制,并且可以嵌套这些控件。 每个 UpdatePanel 都是隔离的,因此每个 UpdatePanel 都可以独立工作 (你可以让两个 UpdatePanel 同时运行,呈现页面的不同部分,独立于页面的回发) 。

UpdatePanel 控件主要处理控件触发器 - 默认情况下,UpdatePanel ContentTemplate 中包含的用于创建回发的任何控件都注册为 UpdatePanel 的触发器。 这意味着 UpdatePanel 可以使用默认数据绑定控件 ((例如 GridView) ),以及用户控件,并且可以在脚本中对其进行编程。

默认情况下,触发分页呈现时,将刷新页面上的所有 UpdatePanel 控件,无论 UpdatePanel 控件是否为此类操作定义了触发器。 例如,如果一个 UpdatePanel 定义了一个 Button 控件,并且单击了该按钮控件,则默认情况下将刷新该页面上的所有 UpdatePanel 控件。 这是因为,默认情况下, UpdateMode UpdatePanel 的 属性设置为 Always。 或者,可以将 UpdateMode 属性设置为 Conditional,这意味着只有在命中特定触发器时才会刷新 UpdatePanel。

自定义控件说明

可以将 UpdatePanel 添加到任何用户控件或自定义控件;但是,包含这些控件的页面还必须包含一个 ScriptManager 控件,其属性 EnablePartialRendering 设置为 true

使用 Web 自定义控件时,可以考虑此问题的一种方法是重写 类的CompositeControl受保护CreateChildControls()方法。 这样,如果确定页面支持部分呈现,则可以在控件的子级与外部世界之间注入 UpdatePanel;否则,只需将子控件分层到容器 Control 实例中。

UpdatePanel 注意事项

UpdatePanel 以黑盒的形式运行,在 JavaScript XMLHttpRequest 的上下文中包装 ASP.NET 回发。 但是,在行为和速度方面,需要牢记重要的性能注意事项。 若要了解 UpdatePanel 的工作原理,以便可以最好地决定其使用时机,应检查 AJAX 交换。 以下示例使用现有站点,具有 Firebug 扩展的 Mozilla Firefox (Firebug 捕获 XMLHttpRequest 数据) 。

考虑一个表单,除其他事项外,该窗体具有一个邮政编码文本框,该文本框应填充窗体或控件上的城市和省/自治区/地区字段。 此表单最终会收集成员身份信息,包括用户名、地址和联系信息。 根据特定项目的要求,需要考虑许多设计注意事项。

显示窗体上的城市、州和邮政编码字段的屏幕截图。

(单击以查看全尺寸图像)

显示标记上带有“控制台”一词的面板的屏幕截图。

(单击以查看全尺寸图像)

在此应用程序的原始迭代中,生成了一个控件,该控件包含整个用户注册数据,包括邮政编码、城市和州/ 地区。 整个控件已包装在 UpdatePanel 中,并放到 Web 窗体上。 当用户输入邮政编码时,UpdatePanel 通过指定触发器或使用将 ChildrenAsTriggers 属性设置为 true) ,检测后端中相应的 TextChanged 事件 (事件。 AJAX 发布 UpdatePanel 中的所有字段,如 FireBug 捕获 (在右侧) 查看图表。

如屏幕截图所示,UpdatePanel 中每个控件的值在此示例中 (传递,) 以及 ViewState 字段都是空的。 总之,发送的数据超过 9kb,而实际上只需要 5 个字节的数据即可发出此特定请求。 响应更加膨胀:总共会向客户端发送 57kb,只是为了更新文本字段和下拉字段。

还可能需要了解 AJAX ASP.NET 如何更新演示文稿。 UpdatePanel 的更新请求的响应部分显示在左侧的 Firebug 控制台显示中;它是一个专门制定的管道分隔字符串,由客户端脚本分解,然后在页面上重新组合。 具体而言,ASP.NET AJAX 设置客户端上表示 UpdatePanel 的 HTML 元素 的 innerHTML 属性。 当浏览器重新生成 DOM 时,存在轻微的延迟,具体取决于需要处理的信息量。

DOM 的重新生成会触发一些其他问题:

显示面板的屏幕截图,其中“控制台”位于选项卡上,代码位于“响应”选项卡上。

(单击以查看全尺寸图像)

  • 如果焦点 HTML 元素位于 UpdatePanel 中,它将失去焦点。 因此,对于按 Tab 键退出邮政编码文本框的用户,他们的下一个目标将是“城市”文本框。 但是,一旦 UpdatePanel 刷新显示,窗体将不再具有焦点,按 Tab 将开始突出显示焦点元素 (,例如链接) 。
  • 如果正在使用访问 DOM 元素的任何类型的自定义客户端脚本,则函数保留的引用可能会在部分回发后失效。

UpdatePanels 并非旨在成为全部捕获的解决方案。 相反,它们为某些情况(包括原型制作、小型控件更新)提供快速解决方案,并为可能熟悉 .NET 对象模型但不太熟悉 DOM 的 ASP.NET 开发人员提供熟悉的界面。 根据应用程序方案,有多种替代方法可提高性能:

  • 请考虑使用 PageMethods 和 JSON (JavaScript 对象表示法) 允许开发人员在页面上调用静态方法,就像正在调用 Web 服务调用一样。 由于方法是静态的,因此不需要任何状态;脚本调用方提供参数,结果以异步方式返回。
  • 如果需要在整个应用程序的多个位置使用单个控件,请考虑使用 Web 服务和 JSON。 这再次需要很少的特殊工作,并且异步工作。

通过 Web 服务或页面方法合并功能也有缺点。 首先,ASP.NET 开发人员通常倾向于将小型功能组件构建到用户控件中, (.ascx 文件) 。 页面方法不能托管在这些文件中;它们必须托管在实际的 .aspx 页类中。 同样,Web 服务必须托管在 .asmx 类中。 根据应用程序,此体系结构可能违反单一责任原则,即单个组件的功能现在分布在两个或更多个物理组件上,这些组件可能几乎没有或没有内聚关系。

最后,如果应用程序要求使用 UpdatePanel,则以下准则应有助于进行故障排除和维护。

  • 尽可能少地嵌套 UpdatePanel,不仅在单元内,而且跨代码单元嵌套。 例如,在包装控件的页面上有一个 UpdatePanel,而该控件还包含一个 UpdatePanel(其中包含另一个包含 UpdatePanel 的控件)是跨单元嵌套的。 这有助于明确应刷新哪些元素,并防止意外刷新子 UpdatePanel。
  • ChildrenAsTriggers 属性设置为 false,并显式设置触发事件。 利用集合 <Triggers> 是处理事件的更清晰方法,可以防止意外行为,帮助执行维护任务并强制开发人员选择加入事件。
  • 使用尽可能小的单位来实现功能。 如对邮政编码服务的讨论中所述,仅包装最小包装可减少服务器的时间、总处理和客户端-服务器交换的占用空间,从而提高性能。

UpdateProgress 控件

UpdateProgress 控件参考

Markup-Enabled属性:

属性名称 类型 说明
AssociatedUpdate-PanelID 字符串 指定此 UpdateProgress 应报告的 UpdatePanel 的 ID。
DisplayAfter int 指定在异步请求开始后显示此控件之前的超时(以毫秒为单位)。
DynamicLayout bool 指定进度是否动态呈现。

标记后代:

标记 说明
<ProgressTemplate> 包含将使用此控件显示的内容的控件模板集。

UpdateProgress 控件提供了一个反馈度量值,以保持用户的兴趣,同时执行必要的工作以传输到服务器。 这可以帮助你的用户知道你正在执行某些操作,即使它可能并不明显,尤其是因为大多数用户习惯于刷新页面并看到状态栏突出显示。

请注意,UpdateProgress 控件可以出现在页面层次结构中的任意位置。 但是,如果从子 UpdatePanel (UpdatePanel 嵌套在另一个 UpdatePanel) 中启动部分回发,则触发子 UpdatePanel 的回发将导致为子 UpdatePanel 以及父 UpdatePanel 显示 UpdateProgress 模板。 但是,如果触发器是父 UpdatePanel 的直接子级,则仅显示与父级关联的 UpdateProgress 模板。

总结

Microsoft ASP.NET AJAX 扩展是复杂的产品,旨在帮助使 Web 内容更易于访问,并为 Web 应用程序提供更丰富的用户体验。 作为 AJAX 扩展 ASP.NET 的一部分,分页呈现控件(包括 ScriptManager、UpdatePanel 和 UpdateProgress 控件)是工具包中一些最明显的组件。

ScriptManager 组件集成了扩展客户端 JavaScript 的预配,并使各种服务器和客户端组件能够以最少的开发投资协同工作。

UpdatePanel 控件是明显的魔术框 - UpdatePanel 中的标记可以具有服务器端 Codebehind 且不会触发页面刷新。 UpdatePanel 控件可以嵌套,并且可以依赖于其他 UpdatePanel 中的控件。 默认情况下,UpdatePanels 处理其子代控件调用的任何回发,尽管此功能可以通过声明方式或编程方式进行微调。

使用 UpdatePanel 控件时,开发人员应了解可能出现的性能影响。 可能的替代方案包括 Web 服务和页面方法,但应考虑应用程序的设计。

UpdateProgress 控件允许用户知道她/他不会被忽略,并且后台请求正在进行,而页面未执行任何操作来响应用户输入。 它还包括中止部分呈现结果的功能。

这些工具共同帮助创建丰富和无缝的用户体验,使服务器对用户不那么明显和中断工作流。

个人简介

Scott Cate 自 1997 年以来一直从事 Microsoft Web 技术工作,是 myKB.com (www.myKB.com) 的总裁,专门编写专注于知识库软件解决方案的基于 ASP.NET 的应用程序。 可以通过电子邮件联系斯科特,也可以通过 scott.cate@myKB.com 他的博客 联系 ScottCate.com