ASP.NET 之页面重定向和传值
在开发 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;
如果源页 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 方法用于查找当前命名容器中的控件。如果正在查找的控件位于其他控件中(通常位于模板中),则必须首先获取对该容器的引用,然后搜索该容器,以查找要获取的控件。
如果源页和目标页不在同一个 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# 编程兵书》
ASP.NET 之页面重定向和传值的更多相关文章
- WebForm 中的页面重定向和传值(转自 MSDN)
——原文地址:https://msdn.microsoft.com/zh-cn/library/6c3yckfw(v=vs.100).aspx 在开发 ASP.NET 网站时,您经常需要从一 ...
- asp.net 的页面几种传值方式
http://www.cnblogs.com/makqiq/p/5882448.html 1.Querystring Querystring也叫查询字符串,这种页面间传递数据是利用网页地址URL.如果 ...
- 详细介绍ASP.NET页面重定向方法
ASP.NET中页面重定向的使用的很频繁,实现方法也有不同,自己也试过几种,现在总结一下. 一.Transfer Execute Redirect重定向方法介绍 1.Server.Transfer方法 ...
- c#ASP.NET中页面传值共有这么几种方式
一.目前在ASP.NET中页面传值共有这么几种方式: 1.Response.Redirect("http://www.hao123.com",false); 目标页面和原页面可以在 ...
- ASP.NET 不同页面之间传值
不同页面之间如何传值?我们假设A和B两个页面,A是传递,B是接收. 下面学习4种方式: 通过URL链接地址传递 POST方式传递 Session方式传递 Application方式传递 1. 通过UR ...
- asp.net 跨页面传值常用方法
常用方法有以下: 1.queryString 2.form-post控件传递 3.cookie 4.application 5.session querystring: http://website. ...
- ASP.NET中页面传值
一.目前在ASP.NET中页面传值共有这么几种方式: 1.表单提交, <form action= "target.aspx" method = "post&q ...
- ASP.NET之页面传值
一.目前在ASP.NET中页面传值共有这么几种方式: 1.使用QueryString变量QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全 ...
- asp页面重定向
asp页面重定向 1.当你点击某页面时(没有登录),而此页面需要登录,登录后页面需要定向到你之前操作的页面时 就用到了重定向. 2.login.aspx?redirUrl="重定向的页面地址 ...
随机推荐
- Codeforces 651B Beautiful Paintings【贪心】
题意: 给定序列,重新排序,使严格上升的子序列最多.求这些子序列总长度. 分析: 贪心,统计每个元素出现次数,每次从剩余的小的开始抽到大的,直到不再剩余元素. 代码: #include<iost ...
- Ajax核心知识(1)
XMLHttpRequest对象创建 所有现代浏览器均支持XMLHttpRequest对象( IE5 和 IE6 使用 ActiveXObject). XMLHttpRequest用于在后台与服务器交 ...
- [bzoj2962]序列操作_线段树_区间卷积
序列操作 bzoj-2962 题目大意:给定一个n个数的正整数序列,m次操作.支持:1.区间加:2.区间取相反数:3.区间求选c个数的乘积和. 注释:$1\le n,m\le 5\cdot 10^4$ ...
- 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成
前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...
- 原想着mysql里放些文件什么的,查完资料还是算了
三种东西永远不要放到数据库里 1.图片,文件,二进制数据,文件还是放入文件服务器吧或者分布式文件系统 2.短生命期数据 3.日志文件 mysql中一张表的数据是全部在一个数据文件中的.如果大字段的数据 ...
- mysql 时间戳格式化函数from_unixtime使用说明
我们一般使用字段类型int(11)时间戳来保存时间,这样方便查询时提高效率.但这样有个缺点,显示的时间戳,非常难知道真实日期时间. mysql提供了一个时间戳格式化函数from_unixtime来转换 ...
- laravel event
事件监听 方法一: web.php Event::listen('eloquent.created: App\post',function(){ dump('A post was created'); ...
- 实战恢复2950交换机的IOS
本来想用两台交换机做实验的,可是通过console口进入其中一台交换机后却发现这个台交换器的IOS文件丢失了 本来正常进入交换机后应该是首先进入到用户模式的,而且提示符应该是">&qu ...
- C#的DataGridView如何修改字体
在RowTemplate中可以修改字体和显示的格式(比如保留几位小数)
- Linux环境部署(一)
最近被老大安排了个任务,解决Linux的安装部署问题,特做如下笔记,以便下次安装配置: --------------------Linux上部署项目------------------- 1.解压缩相 ...