ASP.NET 网页中的跨页发送

ASP.NET 网页中的跨页发送 

 

默认情况下,在 ASP.NET 网页中引起回发的按钮和其他控件将页提交回该页本身。这是 ASP.NET 网页在其正常的处理过程中所要经历的往返周期的一部分。有关详细信息,请参见 ASP.NET 网页介绍

在某些情况下,可能需要将一个页发送到其他页。例如,您可能正在创建一个收集每个页上不同信息的多页窗体。在此情况下,可以将页中的某些控件(实现 IButtonControl 接口的控件,如 Button 控件)配置为发送至不同的目标页。这被称为跨页发送。跨页发送与使用 Transfer 方法重定向到其他页相比,具有一些优点。有关详细信息,请参见将用户重定向到另一页

Note注意

还可以使用 Wizard 控件来创建多视图窗体。有关详细信息,请参见 Wizard Web 服务器控件概述

由于跨页发送是针对各个控件配置的,所以您可以创建一个可根据用户单击哪个按钮而发送至不同页的页。

从源页获取信息

为跨页发送配置页时,您通常需要从源页中获取信息。这可能包括来自页上控件的信息(即由浏览器发送的信息),以及源页的公共属性。

获取控件值

Page 类公开一个名为 PreviousPage 的属性。如果源页和目标页位于同一 ASP.NET 应用程序中,则目标页中的 PreviousPage 属性包含对源页的引用。(如果该页不是跨页发送的目标或者这些页位于不同的应用程序中,则不会初始化 PreviousPage 属性。)默认情况下,PreviousPage 属性类型化为 Page

Note注意

如果源页和目标页位于不同的应用程序中,则无法直接获取页上控件的值,但可以从 Form 字典中读取发送的数据。因为源页经过散列处理,所以不能从源页中读取视图状态。如果要在源页中存储值并使这些值可供其他应用程序中的目标页使用,则可以将这些值作为字符串存储在源页的隐藏字段中,并在目标页中通过 Request.Form 来访问它们。

PreviousPage 属性中使用引用,便可以搜索源页上的控件并提取这些控件的值。通常使用 FindControl 方法来执行此操作。

Note注意

如果您专门对源页进行编码,使它能够与目标页共享信息,则使控件值可用于目标页的更简单的方法是将其作为公共属性公开。有关详细信息,请参见本主题中后面的 Getting Public Property Values from the Source Page

下面的代码示例演示如何才能获取源页中 TextBox1 控件的值。

Visual Basic
If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

FindControl 方法在当前的命名容器中查找控件。如果要查找的控件位于另一控件内(通常位于模板内),则必须先获取对该容器的引用,然后才能在该容器中查找要获取的控件。在下面的代码示例中,源页包含一个 Login 控件,并具有一个 LayoutTemplate 容器,而该容器又包含一个名为 UserNameTextBox 控件。该代码获取 UserName 控件的值。

Visual Basic
Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

从源页获取公共属性值

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
Note注意

在源页上创建的、主要用于为跨页发送公开值的属性通常是只读属性。尽管源页可以包含公共读/写属性,但是通过目标页属性设置源页属性一般没有任何效果,因为不会保留此值。

如果目标页中包含指向源页的 PreviousPageType 指令,则可以使用下面的代码访问源页的 CurrentCity 属性。

Visual Basic
Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

获取对源页的强类型引用的另一种方法是在引用源页的目标页中包含一个 @ Reference 指令,正如引用要在页中使用的任何类型一样。在此情况下,您可以在目标页中获取目标页的 PreviousPage 属性并将其强制转换为源页类型,如下面的代码示例所示。

Visual Basic
Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

检查目标页中的回发

在跨页回发过程中,源页控件的内容被发送至目标页,并且浏览器执行 HTTP POST 操作(不是 GET 操作)。但在目标页中,在跨页发送之后,IsPostBack 属性便立即成为 false。尽管该行为是 POST 的行为,但跨页发送并不是到目标页的回发。因此,IsPostBack 设置为 false,并且目标页可以通过它的第一次代码。

如果这在您的应用程序中有用,则可以确定目标页是否由于跨页发送而正在运行。为此,您可以对目标页的 PreviousPage 属性返回的页引用的 IsCrossPagePostBack 属性进行测试,如下面的代码示例所示。

Visual Basic
If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

请注意,如果当前页不是跨页发送的目标,则 PreviousPage 属性返回 null(在 Visual Basic 中为 Nothing)。

有关更多信息,请参见如何:确定调用 ASP.NET 网页的方式

跨页发送与 Server.Transfer

PreviousPage 属性和 PreviousPageType 指令在调用目标页的两种情况下都很有用:在跨页回发中(这是一种基于客户端的传输)和使用 Transfer 方法时(这是基于服务器的操作)。在以上两种操作中,目标页中的代码都可以使用 PreviousPage 属性获取对源页的引用。

在目标页中,确定页是通过跨页发送还是 Server.Transfer 操作调用可能很重要。为了帮助您执行此操作,Page 类公开了一个名为 IsCrossPagePostBack 的属性。有关详细信息,请参见如何:确定调用 ASP.NET 网页的方式

  @ PreviousPageType 指令,该指令允许您指定源页,如此示例中所示:

 

将用户重定向到另一页 

 

您经常需要将用户重定向到 Web 应用程序的其他页。ASP.NET 提供了下列在网页中生成重定向的方式:

  • 在页上使用超链接

  • 配置跨页发送,它使您能够在提交当前页时指定备用目标页。

  • 通过强制浏览器请求另一页,以编程方式重定向。

  • 通过向同一 Web 应用程序中的另一页传输控件,以编程方式重定向。

下面对每一选项分别进行描述。本主题结尾处的表对这些选项进行了汇总,并提供帮助您确定何时使用各个选项的指导原则。

超链接

可以在 ASP.NET 网页上使用 HTML 定位点标记 (<a>) 来创建静态链接,也可以通过使用 HyperLink 控件以编程方式控制超链接的链接文本和目标 URL。在此情况下,用户显式单击链接,然后浏览器转到目标页。目标页使用 HTTP GET 命令进行调用。因此,不会将与源页有关的任何信息传递到目标页,除非在目标页的 URL 上指定查询字符串。如果源页和目标页位于同一 Web 应用程序中,它们可以使用会话状态或应用程序状态来共享信息。

跨页发送

默认情况下,ASP.NET 网页中的按钮将该页发送到该页本身。跨页发送使您能够在 ASP.NET 网页上配置一个按钮,以便将当前页发送到另一页上。典型的示例是在创建多页窗体时,您可以在页上配置按钮来移动到窗体的下一页和上一页。

跨页发送与超链接的类似之处在于通过用户操作来启动传输。但是,在跨页发送中,目标页是使用 HTTP POST 命令调用的,该命令会将源页上控件的值发送到目标页。此外,如果源页和目标页位于同一 Web 应用程序中,则目标页可以访问源页的公共属性。应用程序中的所有页始终可以共享会话状态或应用程序状态中存储的信息。

有关更多信息,请参见 ASP.NET 网页中的跨页发送如何:将 ASP.NET 网页发送到另一页

使用浏览器以编程方式重定向

可以通过调用 Redirect 方法以编程方式重定向(即无需用户干预,强制浏览器打开新的页)。该方法向用户的浏览器发送命令,由浏览器获取目标页。调用 Redirect 方法是单击超链接的编程等效形式,也会生成对目标页的新的请求(HTTP GET 命令)。由于您使用自己的代码调用 Redirect 方法,所以可以根据应用程序的要求动态定义目标 URL(包括任何查询字符串信息)。与超链接一样,Redirect 方法不会向目标页传递发送信息。如果源页和目标页位于同一 Web 应用程序中,则可以通过将数据存储在会话状态中在源页和目标页之间共享数据。

在服务器上以编程方式重定向

也可以通过调用 Transfer 方法,在服务器上以编程方式重定向到目标页。在此情况下,服务器只是将当前源页的上下文传输给目标页。然后目标页呈现在源页的位置。源页和目标页必须位于同一 Web 应用程序中。与跨页发送一样,Transfer 方法也具有允许目标页从源页中读取控件值和公共属性值的优点。

由于源页和目标页之间的传输在服务器上进行,浏览器没有任何关于更改后的页的信息,它仍保留有关原始(源)URL 的信息。例如,Internet Explorer 中的“地址”框在执行传输后不会发生变化,而是继续显示最近请求的页(通常为源页)的 URL。也不会更新浏览器的历史记录以反映传输过程。如果用户在浏览器中刷新页面或单击浏览器的“后退”按钮,这可能导致意外行为。因此,对于以隐藏 URL 的方式向用户呈现页面的应用程序而言,调用 Transfer 方法是一种最佳的策略。

选择重定向选项

下表汇总了在页间进行重定向的可能方式。

 
策略 特征 用法

超链接

  • 在目标页上执行新的请求。

  • 不会将当前页的信息传递到目标页。

  • 需要用户启动。

  • 可重定向到任何页,而不仅仅是同一 Web 应用程序中的页。

  • 使您能够使用查询字符串或会话状态在页间共享信息。(HyperLink 控件使您能够以编程方式创建 URL 和查询字符串。)

  • 对于不作其他处理的导航,与链接的菜单或列表相同。

  • 导航到另一页应由用户控制时。

跨页发送

  • 将当前页信息发送到目标页。

  • 使发送信息在目标页中变为可用。

  • 需要用户启动。

  • 可重定向到任何页,而不仅仅是同一 Web 应用程序中的页。

  • 当这些页位于相同的 Web 应用程序中时,允许目标页读取源页的公共属性。

  • 用于将当前页的信息传递到目标页(与多页窗体相同)。

  • 当导航应该由用户控制时。

浏览器重定向

  • 在目标页上执行新的请求。

  • 将查询字符串传递到目标页。

  • 提供对目标 URL 和查询字符串的编程控制和动态控制。

  • 使您能够重定向到任何页,而不仅仅是同一 Web 应用程序中的页。

  • 使您能够存储处于会话状态的源页的信息,然后重定向以与目标页实现共享。

  • 用于条件导航,在需要控制目标 URL 和何时导航时使用。例如,如果应用程序必须根据用户提供的数据来确定要导航到的页,请使用该选项。

服务器传输

  • 将控件传输到在源页位置呈现的新页中。

  • 仅重定向到与源页位于相同的 Web 应用程序中的目标页。

  • 使您能够从源页读取值和公共属性。

  • 不会用目标页的相关信息来更新浏览器信息。在浏览器中按“刷新”或“后退”按钮可能导致意外行为。

  • 用于条件导航,在需要控制何时导航和需要访问源页的上下文时使用。

  • 该选项最适合在对用户隐藏 URL 的情况下使用。

如何:将 ASP.NET 网页发送到另一页 

 

默认情况下,ASP.NET 网页上导致回发的控件(如 Button 控件)会回发到页进行处理。但是,可以将控件配置为发送到其他页。例如,您可能正在创建一个收集每个页上不同信息的多页窗体。

在目标页上,可以读取来自源页的控件或公共属性的值。有关更多信息,请参见 ASP.NET 网页中的跨页发送

将一个 ASP.NET 网页发送到另一页

  1. 向网页添加一个按钮控件,如 ButtonLinkButtonImageButton 控件。

  2. 将该控件的 PostBackUrl 属性设置为 ASP.NET 网页要发送到的页的 URL。

    下面的代码示例演示一个 Button 控件,该控件被配置为发送到网站根目录中名为 TargetPage 的页。

    <asp:Button 
      ID="Button1" 
      PostBackUrl="~/TargetPage.aspx"
      runat="server"
      Text="Submit" />

    有关更多信息,请参见如何:在 ASP.NET 网页之间传递值

 

 

如何:确定调用 ASP.NET 网页的方式 

 

通常有必要了解调用 ASP.NET 网页的方式:是由原始请求 (HTTP GET)、回发 (HTTP POST)、来自其他页的跨页发送 (HTTP POST) 调用的,还是由来自其他页(使用 Transfer 方法或使用浏览器中的回调)的传送调用的。Page 类公开可用于确定页调用方式的属性集。

确定调用 ASP.NET 网页的方式

  • 检查以下 Page 类属性的值,然后参照下表来确定页的调用方式:

    下表列出了页调用方式及对应的 Page 属性值。

     
    调用方法 属性值

    原始请求

    • IsPostBack 设置为 false

    • PreviousPage 设置为 null(在 Visual Basic 中为 Nothing)。

    • IsCallback 设置为 false

    回发

    • IsPostBack 设置为 true

    • PreviousPage 设置为 null(在 Visual Basic 中为 Nothing)。

    • IsCallback 设置为 false

    跨页发送

    • IsPostBack 设置为 false

    • PreviousPage 引用源页。

    • IsCrossPagePostBack 设置为 true

    • IsCallback 设置为 false

    服务器传输

    • IsPostBack 设置为 false

    • PreviousPage 引用源页。

    • PreviousPage 中引用的 IsCrossPagePostBack 设置为 false

    • IsCallback 设置为 false

    回调

    • IsPostBack 设置为 false

    • PreviousPage 设置为 null(在 Visual Basic 中为 Nothing)。

    • IsCallback 设置为 true

    Note注意

    确保对 PreviousPage 中引用的页的 IsCrossPagePostBack 属性进行测试。当前页的 IsCrossPagePostBack 属性始终返回 false

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值