ASP.NET_02-04_ASP.NET 重定向:如何将用户重定向到另一页

您可能希望将用户从一个 ASP.NET 网页重定向到另一个网页。例如,可能会在多页窗体中执行此操作。重定向页的方法很多,比如以下方法:

  • 通过动态使用浏览器。在此方案中,向用户的浏览器发送命令,使浏览器检索其他页。采用这种方法,能以编程方式重定向到另一页。但是,这种重定向会导致新的请求 (HTTP GET),并且从源页发送的所有数据都将丢失。
  • 通过将页配置为发送到另一页。在此方案中,用户单击已配置的按钮可以发送到其他页。此方案多用于多页窗体。但需要用户交互。

通过动态使用服务器端方法,服务器只向另一页传递上下文即可。其优点是您可以共享页之间的页上下文信息。其缺点是用户的浏览器不知道在进行传输,因此不更新浏览器的历史记录。如果用户刷新此页,则可能会产生意外的结果。有关在服务器传输期间共享页上下文的详细信息,请参见如何:在 ASP.NET 网页之间传递值。

 

使用浏览器将用户重定向到另一页

1.         将 Response 对象的 BufferOutput 属性设置为 true。

2.         调用 Response 对象的 Redirect 方法,以向其传递用户重定向目标页的 URL。

下面的代码示例演示如何根据局部变量 UserLanguage(在其他地方设置)的内容来进行页重定向。

Response.BufferOutput = true;
if (UserLanguage == "English")
{
    Response.Redirect("http://www.microsoft.com/gohere/look.htm");
}
else if (UserLanguage == "Deutsch")
{
    Response.Redirect("http://www.microsoft.com/gohere/look_deu.htm");
}
else if (UserLanguage == "Español")
{
    Response.Redirect(http://www.microsoft.com/gohere/look_esp.htm);
}

 

使用服务器端方法将用户重定向到另一页

调用 Transfer 方法,以向其传递用户重定向目标页的名称。下面的代码示例演示如何重定向到另一页。

Server.Transfer("Page2.aspx", true);

注意:Redirect 与 Transfer 方法在重定向时的区别。

 

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

默认情况下,ASP.NET 网页上导致回发的控件(如 Button 控件)会回发到自己进行处理。但也可以将控件配置为发送到其他页。例如,您可能正在创建一个收集每个页上不同信息的多页窗体。在目标页上,可以读取来自源页的控件或公共属性的值。

创建一个页面 PostBackUrlPage.aspx。代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PostBackUrlPage.aspx.cs"
    Inherits="PostBackUrlPage" %>
 
<!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 id="Head1" runat="server">
    <title>Button.PostBackUrl Example</title>
</head>
<body>
    <form id="Form1" runat="server">
    <h3>
        Button.PostBackUrl Example</h3>
    Enter a value to post:
    <asp:TextBox ID="TextBox1" runat="Server"></asp:TextBox>
    <br />
    <br />
    <asp:Button ID="Button1" Text="Post back to this page" runat="Server"></asp:Button>
    <br />
    <br />
    <asp:Button ID="Button2" Text="Post value to another page" PostBackUrl="PostBackUrlPage2.aspx"
        runat="Server"></asp:Button>
    </form>
</body>
</html>

回发页 PostBackUrlPage2.aspx,代码如下:

<%@ Page Language="C#" %>
 
<!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 id="Head1" runat="server">
    <title>Untitled Page</title>
 
    <script runat="server">
   1:  
   2:         protected void Page_Load(object sender, EventArgs e)
   3:         {
   4:             string text; text = ((TextBox)PreviousPage.FindControl("TextBox1")).Text;
   5:             if (text != "")
   6:                 PostedLabel.Text = "The string posted from the previous page is " + text + ".";
   7:             else
   8:                 PostedLabel.Text = "An empty string was posted from the previous page.";
   9:         }
  10:     
</script>
 
</head>
<body>
    <form id="Form1" runat="server">
    <h3>
        Button.PostBackUrl Target Page Example</h3>
    <br />
    <asp:Label ID="PostedLabel" runat="Server"></asp:Label>
    </form>
</body>
</html>

 

ASP.NET 网页中的跨页发送

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

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

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

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

获取控件值(PreviousPage属性)

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

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

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

说明:如果您专门对源页进行编码,使它能够与目标页共享信息,则使控件值可用于目标页的更简单的方法是将其作为公共属性公开。

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

if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

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

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.";
}
从源页获取公共属性值(PreviousPageType指令)

在跨页发送的目标页中,也可以获取源页的公共成员的值。最常见的方案是源页定义公共属性,并且您要在目标页上获取这些属性的值。

若要获取源页的公共成员,必须先获取对源页的强类型引用。可以通过多种方法来执行此操作。第一种方法是在目标页中包含一个 @ PreviousPageType 指令,该指令允许您指定源页,如此示例中所示:

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>

包含此指令时,PreviousPage 属性被强类型化为被引用的源页的类。因此,可以直接引用源页的公共成员。可以使用 type 属性直接指定源页的类型,也可以通过在 VirtualPath 属性中显式引用源页来间接指定源页的类型,如该示例中所示。

下面的代码示例演示源页的一部分,其中包含一个名为 CurrentCity 的公共属性,该属性用于公开名为 textCity 的 TextBox 控件的值。

public String CurrentCity
{
    get { return textCity.Text; }
}

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

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

Label1.Text = PreviousPage.CurrentCity;

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

SourcePage_aspx sourcePage; 
sourcePage = (SourcePage_aspx)PreviousPage; 
Label1.Text = sourcePage.CurrentCity;
检查目标页中的回发

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

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

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)。

 

跨页发送与 Server.Transfer

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

在目标页中,确定页是通过跨页发送还是 Server.Transfer 操作调用可能很重要。为了帮助您执行此操作,Page 类公开了一个名为 IsCrossPagePostBack 的属性。

posted @ 2011-09-04 20:49  船长&CAP  阅读(445)  评论(0编辑  收藏  举报
免费流量统计软件