ASP.NET - Ajax 控件

AJAX 代表异步 JavaScript 和 XML。 这是一种跨平台技术,可以加快响应时间。 AJAX服务器控制向页面添加脚本,由浏览器执行和处理。

但是,与其他 ASP.NET 服务器控件一样,这些 AJAX 服务器控件也可以具有与其关联的方法和事件处理程序,这些方法和事件处理程序在服务器端进行处理。

Visual Studio IDE 中的控件工具箱包含一组称为"AJAX 扩展"的控件

AJAX 扩展

ScriptManager 控件

ScriptManager 控件是最重要的控件,必须出现在页面上,其他控件才能工作。

它具有基本语法:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

如果您创建"支持 Ajax 的站点"或从"添加项目"对话框添加"AJAX Web 表单",则 Web 表单会自动包含脚本管理器控件。 ScriptManager 控件负责处理所有服务器端控件的客户端脚本。

UpdatePanel 控件

UpdatePanel 控件是一个容器控件,派生自 Control 类。 它充当其中子控件的容器,并且没有自己的界面。 当其中的控件触发回发时,UpdatePanel 会进行干预以异步启动发布并仅更新页面的该部分。

例如,如果UpdatePanel内的按钮控件被单击,则只有UpdatePanel内的控件会受到影响,页面其他部分的控件不会受到影响。 这称为部分回发或异步回发。

示例

在您的应用程序中添加 AJAX Web 表单。 它默认包含脚本管理器控件。 插入UpdatePanel。 将按钮控件与标签控件一起放置在UpdatePanel控件中。 在面板外部放置另一组按钮和标签。

设计视图如下所示:

ScriptManager

源文件如下:

<form id="form1" runat="server">
   <div>
      <asp:ScriptManager ID="ScriptManager1" runat="server" />
   </div>
   
   <asp:UpdatePanel ID="UpdatePanel1" runat="server">
      <ContentTemplate>
         <asp:Button ID="btnpartial" runat="server" onclick="btnpartial_Click" Text="Partial PostBack"/>
         <br />
         <br />
         <asp:Label ID="lblpartial" runat="server"></asp:Label>
      </ContentTemplate>
   </asp:UpdatePanel>
   
   <p> </p>
   <p>Outside the Update Panel</p>
   <p>
      <asp:Button ID="btntotal" runat="server" onclick="btntotal_Click" Text="Total PostBack" />
   </p>
   
   <asp:Label ID="lbltotal" runat="server"></asp:Label>
</form>

两个按钮控件具有相同的事件处理程序代码:

string time = DateTime.Now.ToLongTimeString();
lblpartial.Text = "Showing time from panel" + time;
lbltotal.Text = "Showing time from outside" + time;

请注意,当页面执行时,如果单击全部回发按钮,则会更新两个标签中的时间,但如果单击部分回发按钮,则只会更新UpdatePanel中的标签。

UpdatePanel

一个页面可以包含多个UpdatePanel,每个面板包含其他控件(例如网格)并显示数据的不同部分。

当发生总回发时,UpdatePanel内容默认更新。 可以通过更改控件的 UpdateMode 属性来更改此默认模式。 让我们看看UpdatePanel的其他属性。

UpdatePanel 控件的属性

下表显示了UpdatePanel控件的属性:

属性 描述
ChildrenAsTriggers 此属性指示回发是否来自子控件,这会导致UpdatePanel刷新。
ContentTemplate 它是内容模板,定义渲染时UpdatePanel中显示的内容。
ContentTemplateContainer 检索动态创建的模板容器对象并用于以编程方式添加子控件。
IsInPartialRendering 指示面板是否作为部分回发的一部分进行更新。
RenderMode 显示渲染模式。 可用的模式有块和内联。
UpdateMode 通过确定某些条件来获取或设置渲染模式。
Triggers 定义集合触发对象,每个触发对象对应于导致面板自动刷新的事件。

UpdatePanel控件的方法

下表显示了UpdatePanel控件的方法:

方法 描述
CreateContentTemplateContainer 创建一个 Control 对象,充当定义 UpdatePanel 控件内容的子控件的容器。
CreateControlCollection 返回 UpdatePanel 控件中包含的所有控件的集合。
Initialize 如果启用了部分页面渲染,则初始化 UpdatePanel 控件触发器集合。
Update 导致 UpdatePanel 控件的内容更新。

UpdatePanel的行为取决于 UpdateMode 属性和 ChildrenAsTriggers 属性的值。

UpdateMode ChildrenAsTriggers 效果
Always False 非法参数。
Always True 如果整个页面刷新或者其上的子控件回发,UpdatePanel 会刷新。
Conditional False 如果整个页面刷新或外部触发控件发起刷新,UpdatePanel 就会刷新。
Conditional True 如果整个页面刷新或者其上的子控件回发或者其外部的触发控件发起刷新,UpdatePanel 就会刷新。

UpdateProgress 控件

当更新一个或多个UpdatePanel控件时,UpdateProgress 控件会在浏览器上提供一种反馈。 例如,当用户在执行某些面向数据库的作业时登录或等待服务器响应时。

它提供了诸如"正在加载页面..."之类的视觉确认,表明工作正在进行中。

UpdateProgress 控件的语法是:

<asp:UpdateProgress ID="UpdateProgress1" runat="server" DynamicLayout="true" AssociatedUpdatePanelID="UpdatePanel1" >

   <ProgressTemplate>
      Loading...
   </ProgressTemplate>
   
</asp:UpdateProgress>

上面的代码片段显示了 ProgressTemplate 标记内的一条简单消息。 但是,它可以是图像或其他相关控件。 每次异步回发都会显示 UpdateProgress 控件,除非使用 AssociatedUpdatePanelID 属性将其分配给单个UpdatePanel。

UpdateProgress 控件的属性

下表显示了更新进度控件的属性:

属性 描述
AssociatedUpdatePanelID 获取并设置与此控件关联的更新面板的 ID。
Attributes 获取或设置 UpdateProgress 控件的级联样式表 (CSS) 属性。
DisplayAfter 获取并设置显示进度模板之前的时间(以毫秒为单位)。 默认为 500。
DynamicLayout 指示进度模板是否动态渲染。
ProgressTemplate 表示异步回发期间显示的模板,该模板所花的时间比 DisplayAfter 时间更长。

UpdateProgress 控件的方法

下表显示了UpdateProgress控件的方法:

方法 描述
GetScriptDescriptors 返回 UpdateProgress 控件的客户端功能所需的组件、行为和客户端控件的列表。
GetScriptReferences 返回 UpdateProgress 控件的客户端脚本库依赖项列表。

Timer 定时器控件

Timer 定时器控件用于自动启动回发。 这可以通过两种方式完成:

(1)设置UpdatePanel控件的Triggers属性:

<Triggers> 
   <asp:AsyncPostBackTrigger ControlID="btnpanel2" EventName="Click" />
</Triggers>

(2) 将 Timer 计时器控件直接放置在 UpdatePanel 内以充当子控件触发器。 单个计时器可以触发多个 UpdatePanel。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">

   <ContentTemplate>
      <asp:Timer ID="Timer1" runat="server" Interval="1000">
         </asp:Timer>
         
      <asp:Label ID="Label1" runat="server" Height="101px" style="width:304px" >
         </asp:Label>
   </ContentTemplate>
   
</asp:UpdatePanel>