WebForm 中的页面重定向和传值(转自 MSDN)

2023-04-25,,

在开发 ASP.NET 网站时,经常需要从一个网页重定向(导航)到另一个网页,同时希望能够将信息从源页传递到目标页。例如,如果你正在开发一个保险网站,需要用一个页面来收集基本信息(用户信息、保险产品信息等),用另一个页面用来完成支付过程,而支付页面又需要前一页面的部分信息,这时就需要进行页面重定向和传值。

实现网页之间信息传递的方式有很多种,例如,在页面上添加<a>标签并设置其href属性、运用 windows.location 对象、在后台代码中实现等。这里主要介绍如何在后台代码中实现网页之间的重定向和传值。

新建初始项目

文件 -> 新建 Asp.Net Web 应用程序 -> Empty -> 取名为 PassValueDemo

添加新建项 -> Web窗体 -> SourcePage.aspx(源页)-> 继续添加Web窗体 -> TargetPage.aspx(目标页)

   

网页相互调用

      Response.Redirect 方法用于将客户端重定向到新的 URL。(Request、Response 对象的常用属性可以参考附录)

备注:URL 可以是绝对路径,如 http://www.baidu.com 也可以是相对路径,如 TargetPage.aspx ,但某些浏览器可能会拒绝相对路径

//从 SourcePage.aspx 重定向到服务器上的另一个网页 TargetPage.aspx
Response.Redirect("TargetPage.aspx");
//从 SourcePage.aspx 重定向到任一URL地址
Response.Redirect("http://www.baidu.com");

Server.Transfer 方法用于终止当前页的执行,并使用指定的页 URL 路径来开始执行一个新页。

备注:1. URL 中指定的页面必须在服务器端存在(不能是 http://www.baidu.com 等)

  2. ASP.NET 执行此方法时不会验证当前用户是否有访问 URL 的权限,若需验证用户权限,可以考虑用 Response.Redirect 或 WindowsPrincipal.IsInRole 方法

  3. 页面跳转后浏览器中的 URL 地址不变,还是显示原来的 URL

//终止当前页 SourcePage.aspx ,执行服务器上的另一网页 TargetPage.aspx
Server.Transfer("TargetPage.aspx");

网页之间传递值

1. 使用查询字符串 

      HttpRequest.QueryString 属性(NameValueCollection 类型)

      示例:下面的代码示例演示两种方法可以获取名为"fullname"的查询字符串变量的值。

在每个示例中,如果 URL 是 http://localhost:49495/Target.aspx?fullname=Fadi%20Fakhouri ,则返回的值为"Fadi Fakhouri",因为 %20 是 URL 解码为一个空格字符。如果该 URL 不具有 fullname 查询字符串 ID,则返回的值将为 null

第一行代码会查找键仅在查询字符串中的"fullname",第二行查找密钥"fullname"中的所有 HTTP 请求的集合。

//从 QueryString 中获取指定的对象
string fullname1 = Request.QueryString["fullname"];
//从 QueryString、Form、Cookies 或 ServerVariables 集合获取指定的对象
string fullname2 = Request["fullname"];

2. 使用会话状态

2.1 HttpCookie 类

获取和设置各 Cookie 的属性。 HttpCookieCollection 类提供存储、检索和管理多个 Cookie 的方法。

ASP.NET 包含两个内部 Cookie 集合。通过 HttpRequest 对象的 Cookies 集合访问的集合,包含以 Cookie 标头形式由客户端传输到服务器的 Cookie。通过 HttpResponse 对象的 Cookies 集合访问的集合包含一些新 Cookie,这些 Cookie 在服务器上创建并以 Set-Cookie HTTP 响应标头的形式传输到客户端。

[注意:可以设置Cookie的HttpOnly属性,这样浏览器上的javascript就无法读到Cookie信息(在chrome中测试好像无效?),从而防止xss攻击。]

      示例:下面的代码示例演示如何对 HttpRequest 对象中名为 DateCookieExample 的 Cookie 进行检查。

如果找不到该 Cookie,则将创建它并将其添加到 HttpResponse 对象。Cookie 设置为 10 分钟后过期。

<%@ Page Language="C#" %>
<!DOCTYPE html
<body>
<form id="form1" runat="server">
<asp:Label ID="labCookie" runat="server"></asp:Label>
</form>
<script runat="server"> protected void Page_Load(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
// 从当前请求 HttpRequest 中获取 Cookie
HttpCookie cookie = Request.Cookies.Get("DateCookieExample"); // 检查当前请求中是否存在 Cookie
if (cookie == null)
{
sb.Append("未从客户端获取到 Cookie ");
sb.Append("正在创建 Cookie 并添加到服务器的 http 响应对象中<br/>");
// 创建 Cookie
cookie = new HttpCookie("DateCookieExample");
// 把 Cookie 的值设置为当前时间
cookie.Value = DateTime.Now.ToString();
// 设置 Cookie 的过期时间为10分钟
cookie.Expires = DateTime.Now.AddMinutes(10d);
// 把 Cookie 添加到当前的http响应 HttpResponse 中
Response.Cookies.Add(cookie);
}
else
{
sb.Append("从客户端获取到的 Cookie <br/>");
sb.Append("Cookie 名称: " + cookie.Name + "<br/>");
sb.Append("Cookie 值: " + cookie.Value + "<br/>");
sb.Append("Cookie 过期时间: " + cookie.Expires.ToString() + "<br/>");
}
labCookie.Text = sb.ToString();
}
</script>
</body>

2.2Page.Session 属性(HttpSessionState 类型)

该属性提供有关当前请求的会话的信息。为从 ASP.NET 应用程序请求页或文档的每个用户维护一个 Session 对象。当用户在应用程序中从一页移动到另一页时,存储在 Session 对象中的变量不会被放弃;相反,只要用户在应用程序中访问页,这些变量就将保持。

[注意:Session是根据浏览器类型和url地址打不同而创建的,Cookie中一般会保存一个SessionId,如果只是更换了登录帐号,SessionId不会改变。每个用户只能访问自己的Session对象。在Application对象里还对应有Session_Begin(创建)和Session_End(过期)事件。]

有关会话状态的更多信息,请参见 ASP.NET Session State Overview。

Session["Name"] = tbName.Text;
Session["Email"] = tbEmail.Text;

2.3 Page.Application 属性(HttpApplicationState 类型)

ASP.NET 应用程序是单个 Web 服务器上的某个虚拟目录及其子目录范围内的所有文件、页、处理程序、模块和代码的总和。

HttpApplicationState 类的单个实例在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建。对于 Web 服务器上的每个 ASP.NET 应用程序都要创建一个单独的实例。然后通过内部 Application 对象公开对每个实例的引用。

应用程序状态不在网络场(应用程序被多台服务器承载)或网络园(应用程序被同一台计算机上的多个进程承载)中共享。

Application.Lock();
tbName.Text = Application["Name"];
Application.UnLock();

3. 从源页获取公共属性值

如果源页专门设计为与目标页共享信息,并且这两个页都是 ASP.NET 网页,则可以在源页中添加公共属性,用于公开要在页之间共享的信息。然后,可以在目标页中读取这些属性的值。(备注:仅当这两个页位于同一个 Web 应用程序中时,才能在目标页中读取源页属性。)

3.1 从源页获取公共属性值

在源页 SourcePage.aspx 中,创建一个或多个公共属性。

3.1.1 下面的代码示例演示一个名为 CurrentCity 的属性,该属性公开名为 textCity 的 TextBox 控件的值。

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

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

3.1.2 在目标页 TargetPage.aspx 上,添加一个指向源页的 @ PreviousPageType 页面指令。

下面的代码示例演示一个引用名为 SourcePage.aspx 的源页的 PreviousPageType 指令。

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>或者 <%@ Reference Page="~/SourcePage.aspx" %>

备注:PreviousPageType 指令会导致页的 PreviousPage 属性被类型化为源页类。

3.1.3 在目标页 TargetPage.aspx 代码中,使用 PreviousPage 属性的强类型成员读取源代码属性。

下面的代码示例读取源页 SourcePage.aspx 中定义的 CurrentCity 属性的值。

Label1.Text = PreviousPage.CurrentCity;

3.2 从同一个应用程序的源页中获取控件信息

如果源页 SourcePage.aspx 和目标页 TargetPage.aspx 都是 ASP.NET 网页,并且位于同一个 Web 应用程序中,则可以在目标页中读取源页中的控件值。如果源页不公开需要共享的信息的属性,则可以使用此策略。

在目标页中,通过使用目标页的 PreviousPage 属性获取对源页的引用,然后调用 FindControl 方法获取对所需控件的引用。

下面的代码示例获取源页 SourcePage.aspx 的 TextBox1 控件的值,并将其显示在名为 Label1 的控件中:

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

注:FindControl 方法用于查找当前命名容器中的控件。如果正在查找的控件位于其他控件中(通常位于模板中),则必须首先获取对该容器的引用,然后搜索该容器,以查找要获取的控件。

3.3 从其他应用程序的源页中获取发送信息

如果源页和目标页不在同一个 Web 应用程序中,则可以在目标页中读取源页的发送的值。如果目标页是 ASP.NET 网页,但源页不是,则也可以使用此技术。

备注:只能获取发送的值,而无法读取页中的任意控件的值。

在目标页 TargetPage.aspx 中,读取 Form 集合,此集合返回名称/值对的字典(每一个发送的值对应一个名称/值对)。

下面的代码示例演示源页 SourcePage.aspx 中每个发送的控件的 ID 和值,并在名为 Label1 的标签中显示发送的值。

void Page_Load(object sender, EventArgs e)
{
System.Text.StringBuilder displayValues = new System.Text.StringBuilder();
System.Collections.Specialized.NameValueCollection postedValues = Request.Form;
String nextKey;
for(int i = ; i < postedValues.AllKeys.Length - ; i++)
{
nextKey = postedValues.AllKeys[i];
if(nextKey.Substring(, ) != "__")
{
displayValues.Append("<br>");
displayValues.Append(nextKey);
displayValues.Append(" = ");
displayValues.Append(postedValues[i]);
}
}
Label1.Text = displayValues.ToString();
}

备注:ASP.NET 网页中的发送信息包括隐藏字段的值,如 __VIEWSTATE、__EVENTTARGET 和 __EVENTARGUMENT,这些值在页中进行内部处理时使用。上面的代码示例排除以两个下划线 (__) 作为开头命名的发送字段的值。

Request和Response对象介绍:

1. Request 对象的常用属性和方法

属性 说明
 ApplicationPath 获取服务器上ASP.NET应用程序的虚拟应用程序根路径
 Browser  获取有关正在请求的客户端浏览器功能的信息
 Cookies  获取客户端发送的cookie的集合
 FilePath  获取当前请求的虚拟路径
 Files  获取客户端上载的文件(多部件MIME格式)集合
 Form  获取窗体变量集合
 QueryString  获取HTTP查询字符串变量集合
 RequestType  获取或设置客户端使用的HTTP数据传输方法(GET或POST)
 ServerVariables  获取Web服务器变量的集合
 Url  获取有关当前请求的URL的信息
 UserHostAddress  获取远程客户端的IP主机地址
 UserLanguages  获取客户端语言首选项的排序字符串数组
 MapPath  将请求的URL中的虚拟路径映射到服务器上的物理路径
 SaveAs  将HTTP请求保存到磁盘
 ValidateInput  验证由客户端浏览器提交的数据,如果存在具有潜在危险的数据,则引发异常

2. Response对象常用属性和方法

属性 说明
 Buffer 获取或设置一个值,指示是否缓存输出,并在处理整个响应之后发送缓存
 Output 启用到输出HTTP响应流的文本输出
 OutputStream 启用到输出HTTP内容主体的二进制输出
 RedirectLocation 获取或设置HTTP ”位置“ 标头的值
 Status 设置返回到客户端的Status栏 
 Clear 清除缓冲区流中的所有输出内容
 End 将当前所有输出缓冲发送到客户端,停止该页面的执行 
 Flush 向客户端发送当前所有输出缓存 
 Redirect 将客户端重新定位到新的URL 
 Write 将信息写入HTTP内容输出流 
WriteFile 将指定的文件直接写入HTTP内容输出流 

参考资料:

1. https://msdn.microsoft.com/zh-cn/library/6c3yckfw(v=vs.100).aspx

2. 《C# 编程兵书》

WebForm 中的页面重定向和传值(转自 MSDN)的相关教程结束。

《WebForm 中的页面重定向和传值(转自 MSDN).doc》

下载本文的Word格式文档,以方便收藏与打印。