65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 3.5 扩展预览 - AJAX 历史记录管理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.16/5 (9投票s)

2008年4月10日

CPOL

4分钟阅读

viewsIcon

103121

downloadIcon

544

存储 ajax 历史记录点并使用浏览器的后退和前进按钮进行导航。

引言

ASP.NET 3.5 扩展预览现在正受到越来越多的关注,并且收到了许多文章,旨在讨论 ASP.NET API 的各种增强功能和新增功能。其中一项非常好的增强功能是 ASP.NET AJAX 能够管理 AJAX 事件的历史记录并将其记录到浏览器的历史记录日志中。

您可以在此处 http://quickstarts.asp.net/3-5-extensions/ 和此处 http://www.asp.net/downloads/3.5-extensions/ 查看更多关于 ASP.NET 3.5 扩展预览及其所有新功能的信息。

背景

在扩展之前,开发人员花费了大量时间来让浏览器记录 AJAX 事件的历史记录,并使用浏览器自己的前进和后退按钮导航这些事件,而且很可能未能实现这一要求。

但是现在,有了扩展,您只需几行代码即可实现此功能。本文将向您展示如何操作。

ASP.NET 3.5 扩展预览

首先,您需要从此处 http://www.microsoft.com/downloads/details.aspx?FamilyId=A9C6BC06-B894-4B11-8300-35BD2F8FC908&displaylang=en 下载 ASP.NET 3.5 扩展预览到您的机器上。

成功安装扩展后,您会在 Visual Studio 2008 IDE 中找到许多新的项目模板和控件...

管理 AJAX 历史记录

首先,打开您的 Visual Studio 2008 实例并创建一个新的 ASP.NET 3.5 扩展网站。

ASP.NET 3.5 Extensions new project templates

请注意扩展所添加的各种新控件,但为了本文的范围,我们将不使用任何它们。

New controls Toolbar

首先添加一个标签和一个按钮,分别命名为“lblValue”和“btnIncrement”。

双击按钮以处理 Click 事件。将以下代码复制并粘贴到此处:

protected void btnIncrement_Click(object sender, EventArgs e)
{
    lblValue.Text = string.IsNullOrEmpty(lblValue.Text) ? "0": (Convert.ToInt32(lblValue.Text) + 1).ToString();
}
        

基本上,当您运行网站并单击“Increment”按钮时,标签的值将递增。但我需要您注意浏览器中的一些情况。

单击 Increment 之前 单击 Increment 之后
Postback - Before click Postback - After click

请注意,当您单击 Increment 按钮时,浏览器会跟踪您的事件,并且每当您单击浏览器的后退按钮时,您都会返回到以前的状态……同时请注意,每当您单击 Increment 按钮时,整个页面都会回发(从可用性角度来看这不是一件好事)。

因此,为了使页面更具可用性,您应该添加一个 UpdatePanel,并将标签和按钮都放在该面板内,如下所示。

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
   <div>
      <asp:UpdatePanel ID="UpdatePanel1" runat="server">
         <ContentTemplate>
            <asp:Label ID="lblValue" runat="server"></asp:Label>
            <br />
            <asp:Button ID="btnIncrement" runat="server" onclick="btnIncrement_Click" Text="Increment" />
         </ContentTemplate>
      </asp:UpdatePanel>
   </div>
</form>

现在,运行应用程序并注意发生了什么。

单击 Increment 之前 单击 Increment 之后
UpdatePanel - Before UpdatePanel - After

浏览器没有识别发生的事情,因为该事件是异步在后台触发的,而没有进行整个页面的回发。

那么我们如何解决这个问题呢?

ASP.NET 扩展预览为我们提供了一个 API,用于处理 AJAX 事件并同时更新浏览器历史记录,分为两个步骤。

第一步,我们需要处理更改应用程序状态的事件(在我们的例子中是按钮的 Click 事件),并在每次新更改时创建一个历史记录点。

第二步,我们需要处理浏览器导航事件,这样当用户单击后退或前进按钮时,应用程序将恢复到最新的历史记录点。

步骤 1

在按钮的 Click 事件处理程序中,我们需要检查此条件:

if(ScriptManager1.IsInAsynchPostBack && !ScriptManager1.IsNavigating)
   ScriptManager1.AddHistoryPoint("index", lblValue.Text, string.Format("Step {0}", lblValue.Text));

此检查是为了确保:

  1. 我们处于异步回发状态
  2. 此回发不是由用户单击浏览器后退或前进按钮引起的

AddHistoryPoint 方法接受三个参数(它还有其他两个重载)。

  • 键:您可以为页面中不同的 AJAX 部分存储不同的键(例如,如果您有另一个需要存储事件历史记录的 AJAX 面板,则可以使用另一个键,以免它们重叠)。
  • 状态:您将在此存储当前历史记录点的值(在我们的例子中是标签的值)。
  • 标题:一个将显示在浏览器后退和前进按钮中的标题。

添加此代码后,返回 .aspx 页面,并在 ScriptManager1 标记中添加 EnableHistory 属性。将其设置为 true

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

第二步

我们需要处理浏览器导航。为此,请向 ScriptManager1 控件的 Navigate 事件添加一个处理程序。

Navigation event handler

当用户单击浏览器的后退或前进按钮时,会引发此事件。

接下来的事情是获取新历史记录点状态的值并将其存储到标签中。

protected boid ScriptManager1_Navigate(object sender, HistoryEventArgs e)
{
   lblValue.Text = e.State["index"];
}

现在注意运行应用程序时的区别。

Solution 1

您现在可以使用浏览器的后退和前进按钮来导航您的应用程序。

Solution 2

结论

总结本文,ASP.NET 扩展预览为我们提供了多项新功能和增强功能,其中一项是开发人员能够将 AJAX 事件记录为历史记录点,并管理浏览器的导航以恢复这些事件。

© . All rights reserved.