URL、Session、Cookies、Server.Transfer、Application和跨页面传送,利弊比较
URL、Session、Cookies、Server.Transfer、Application和跨页面传送。
-
本题考查面试者对ASP.NET中多页面传值的理解是否全面。因为ASP.NET的页面表单提交到自身,完成回传的功能,所以默认情况下不能使用POST方式进行多页面传值。关于这些传值方式的分析如下所示。
1.URL传值
这是经典的传值方式,这种方法的使用非常简单,不过所传递的值是会显示在浏览器的地址栏上的,而且不能传递对象。所以这种方法一般用于传递的值少且安全性要求不高的情况下。在*.aspx页面开发中可以使用超级链接文本进行传值,如以下代码所示。
<asp:HyperLink runat="server" ID="HpLink"
NavigateUrl="~/GetValues.aspx?urlvalue1=intel&urlvalue2=amd">URL传值</asp:HyperLink>
以上链接文本将页面跳转到GetValues.aspx页面,并且通过URL传递urlvalue1变量和urlvalue2变量,其值分别为intel和amd。在*.cs的服务器端方法中也可以调用HttpResponse对象的Redirect方法,将浏览器端重定向到新页面并通过URL传值,如以下代码所示。
Response.Redirect(“~/GetValues.aspx?urlvalue1=intel&urlvalue2=amd”);
2.Session传值
这种方法将每份数据存储于服务器变量中,可以传递比较多的数据,并且安全性较高,所以常用于用户身份的验证功能中。不过,Session变量如果存储过多的数据会消耗过多的服务器资源,编程者在使用时应该慎重,其使用方法如以下代码所示。
Session["SessionValue"] = “ATI”;
//也可以用索引存储
Session[0] = “ATI”;
//在其他页面的服务器端方法中取值方式为:
string str = Session["SessionValue"].ToString();
//也可以用索引获取
string str = Session[0].ToString();
Session的可在应用程序的多个页面中以名称/值对的方式共享,直到浏览用户关闭自己的浏览器或者服务器Session超时(可设置,默认为20分钟)。
3.Cookie传值
Cookie是一种比较特殊的数据存储方式,因为这种方式将数据存储于浏览用户的电脑中,以文本文件的形式存在于磁盘中。这种方式非常有意思,很多登录系统就是利用Cookie实现用户自动登录。即用户登录一次的登录信息将被写入到用户电脑的Cookie文件中,下次登录时,网站自动读取该Cookie完成身份验证。通过Cookie传递数据虽然很方便,保存时间可以自由设置,但是安全性不高,编程者不应过于依赖Cookie,而应采用结合的方式完成敏感数据的存储。
ASP.NET中操作Cookie的主要类型位于System.Web命名空间下,分别为HttpCookie、HttpResponse以及HttpRequest。HttpCookie可建立和操作独立Cookie的安全类型,访问HttpResponse和HttpRequest的Cookies属性可以获取HttpCookieCollection集合对象,以读取或添加HttpCookie对象。添加Cookie的方法如以下代码所示。
//创建一个HttpCookie 对象,向构造函数传递名称值
HttpCookie ck = new HttpCookie("CookieValue");
//设置ck的“Value”属性(值)
ck.Value = “Cookie值”;
//设置ck的过期时间为当前时间加上360s,即6分钟后失效
ck.Expires = DateTime.Now.AddSeconds(360);
//设置ck有效范围(域限制)
ck.Domain = "www.google.cn";
//将ck添加至HttpCookieCollection对象
Response.Cookies.Add(ck);
//也可为以下方法添加
//Response.AppendCookie(ck);;
读取用户的Cookie则更为简单,只需根据名称读取HttpCookieCollection集合对象中的子项即可,如以下代码所示。
string str = Request.Cookies["CookieValue"].Value;
除此之外,还可以利用一个HttpCookie存储多个名称/值对形式的Cookie信息,如以下代码所示。
HttpCookie ck = new HttpCookie("CookieValue");
//以名称/值对的方式添加多个Cookie信息
ck.Values.Add("value1", “one”);
ck.Values.Add("value2", "two");
//设置ck的过期时间为当前时间加上100年,即100年后失效
ck.Expires = DateTime.Now.AddYears(100);
//通过以下两种方法添加
Response.Cookies.Add(ck);
//Response.AppendCookie(ck);
读取这些Cookie如以下代码所示。
string str = "值1:"+Request.Cookies["CookieValue"].Values["value1"];
str += "值2:" + Request.Cookies["CookieValue"].Values["value2"];
说明:多数浏览器支持最多可达4096字节的Cookie,如果要将为数不多的几个值保存到用户计算机上,浏览器还限制了每个站点可以在用户计算机上保存的Cookie数量。大多数浏览器只允许每个站点保存20个Cookie。如果试图保存更多的Cookie,则最先保存的Cookie就会被删除。还有些浏览器会对来自所有站点的Cookie总数作出限制,这个限制通常为300个。用户可以设置自己的浏览器,拒绝接受Cookie,这种情况下只能结合其他的数据存储方式。
4.Server.Transfer传值
这个方法的步骤相对较多,使用该方法编程者可以在另一个页面以公开对象属性的方式来存取值,使用这种方法是面向对象的。该方法的代码编写并不复杂,首先通过定义一个public权限的属性,该属性可返回所需传递的值。然后在第两个页面中,使用Context.Handler属性来获得前一个页面实例对象的引用,即可通过访问自定义的属性获取需要的值。
假设SendValues.aspx页面为传递数据的页面,在SendValues.aspx.cs的页面类中定义一个public属性,通过get直接返回需要传递的值(可为页面中某个服务器控件的属性值)。
public string TransferData
{
get
{
return "VIA";
}
}
在SendValues.aspx.cs的某个方法(如Button控件的Click事件处理方法)中调用HttpServerUtility对象的Transfer方法,如以下代码所示。
Server.Transfer("~/GetValues.aspx");
假设GetValues.aspx为第二个页面,在GetValues.aspx.cs的Page_Load方法中接收前一个页面所传递的值,方法如以下代码所示。
//定义SendValues类型的变量SV_Page
SendValues SV_Page;
//访问HttpContext对象的Handler属性,将值转换为SendValues类型,引用赋值给SV_Page
SV_Page = (SendValues)Context.Handler;
//SV_Page即为SendValues.aspx页面类的对象,直接获取其TransferData属性值
string str = SV_Page.TransferData;
可见,这种方法对于有面向对象基础的编程者而言非常容易理解。不过页面间如果需要传递数量比较多的值,这种方法需要定义过多的属性,略显繁杂。编程者还可以直接使用HttpContext对象的“Iterms”属性添加多项名称/值对的数据,在SendValues.aspx.cs调用HttpServerUtility对象的Transfer方法的某个方法中,修改代码如下所示。
Context.Items["value1"] = "one";
Context.Items["value2"] = "two";
在GetValues.aspx.cs的Page_Load方法中接收前1个页面所传递的值,修改代码如以下代码所示。
string str = "值1:" + Context.Items["value1"].ToString();
str += "值2:" + Context.Items["value2"].ToString();
5.Application传值
严格地说应该是通过HttpApplication对象在服务器端生成一个状态变量来存储所需的信息,该HttpApplication对象变量的可用范围覆盖整个WEB应用程序。所以该对象一般存储一些要公布的信息,如在线人数等,而对于那些涉及用户个人的敏感数据则不用这种方法存储。HttpApplication对象有两个常用的方法,即Lock和UnLock方法,可用于处理多个用户对存储在Application变量中的数据进行写入的问题。Lock方法锁定全部的Application变量,从而阻止其他用户修改Application对象的变量值,UnLock方法则解除对HttpApplication对象变量的锁定。通过HttpApplication对象传值的方法和Session比较相似,在页面类的某个方法中编写代码如下所示。
Application["a"] = "微软公司";
Application["b"] = "苹果公司";
Application["c"] = “Mac”;
以上代码很轻松地将三个字符串值保存在HttpApplication对象的变量中了,并且这些变量是整个程序共享的,其他用户通过相应的页面同样可以获取。获取这些变量的方法如以下代码所示。
Application.Lock();
string str = "值1:" + Application["a"];
str += "值2:" + Application["b"];
str += "值3:" + Application["c"];
Application.UnLock();
注意:虽然使用方式和Session相似,但是Session是对于每个单独的用户,当该用户关闭浏览器,则Session失效。HttpApplication对象存储的变量是针对所有访问程序的用户,即使有用户关闭了浏览器,变量的值不会丢失。
6.跨页面传送
跨页面传送和调用HttpServerUtility对象的Transfer方法有相似之处,不过效率更高。因为调用HttpServerUtility对象的Transfer方法是基于服务器的方法,而跨页面传送是基于浏览器端的。这个方法主要是设置控件的“PostBackUrl”属性,使该控件(如Button)操作后转向指定页面,并且这个指定页面可以直接获取前一个页面的所有控件对象及其属性值。假设第一个页面为SendValues.aspx,在该页面中(非*.cs代码文件)添加两个控件,设置如以下代码所示。
<asp:TextBox runat="server" ID="PbValue" Text="Geforce TX280"></asp:TextBox>
<asp:Button runat="server" ID="btn6" Text="跨页面传送方式" PostBackUrl="~/GetValues.aspx" />
以上代码中,TextBox控件的“Text”属性为“Geforce TX280”,这是所需要传送的值。而Button控件的“PostBackUrl”属性指定了GetValues.aspx页面,该页面即可接收所需传递的值。在GetValues.aspx.cs的Page_Load方法中,编写以下代码。
//PreviousPage为向当前页面传输控件的页面
if (PreviousPage != null)
{
//从PreviousPage容器中搜索“ID”为PbValue的控件,并转换为TextBox类型
TextBox tb = (TextBox)PreviousPage.FindControl("PbValue");
//如果tb不是空引用
if (tb != null)
{
//将tb的“Text”属性值给str变量
string str = tb.Text;
}
}
以上代码轻松获得了前一个页面中TextBox控件的“Text”属性值,这种方法比调用HttpServerUtility对象的Transfer方法更加快捷,并减少了处理步骤。
以上为常用的页面间传值方法,如果有特殊需要,还可以使用其他方法,例如通过数据库存储临时数据等。
详细出处参考:http://www.jb51.net/article/20927.htm
URL、Session、Cookies、Server.Transfer、Application和跨页面传送,利弊比较的更多相关文章
- 页面跳转 Server.Transfer和 Response.Redirect的区别
1.Server.Transfer 用于把处理的控制权从一个页面转移到另一个页面,在转移的工程中没有离开服务器内部控件(如request,session等)保存的信息不变.因此你能从a页面跳转到b页面 ...
- 1. Server.Transfer和Response.Redirect
今天在使用ServerTransfer和Response.Redirect定位到当前页面来实现刷新页面时,发现了一些现象: 1.使用Response.Redirect刷新本页面,造成当前页面显示的数据 ...
- ASP.NET页面之间传值Server.Transfer(4)
这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效. Serve ...
- c#页面重定向,Server.Transfer 和 Response.Redirect
Server.Transfer() 重定向发生在服务器端,把处理的控制权从当前页面转移到另一个页面,在转移的工程中没有离开服务器内部控件(如request,session等)保存的信息不变. 1.只能 ...
- Server Transfer()和Response.Redirect()的使用
一.Server Transfer() Server.Transfer:对于当前请求,终止当前页的执行,并使用指定的页url路径来开始执行一个新页. 1. Server.Transfer只能够转跳到本 ...
- ASP.NET页面传值之Server.Transfer 和Response.Direct
先看实例: B.apsx: public string TextBox1Text { get { ...
- Server.Transfer和Response.Redirect区别
根本上,Response是叫浏览器去重新转向到指定的网页,而Server自然是发生在服务器端为主了,因此会有以下区别:1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Resp ...
- response.redirect和server.Transfer的差别详解
Response.Redirect和Server.Transfer都能实现页面的跳转,但两者又有很大区别. 一 地址栏里显示的地址不同 Response.Redirect会显示跳转的网页的地址,而Se ...
- ASP.NET页面之间传值的方式之Server.Transfer(个人整理)
Server.Transfer 这个方法相比以前介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写 ...
随机推荐
- dedeCMS /plus/ad_js.php、/plus/mytag_js.php Vul Via Injecting PHP Code By /plus/download.php Into DB && /include/dedesql.class.php
目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于这个漏洞,我们可以简单概括如下 . "/plus/download. ...
- sed学习笔记
sed是一个文本处理工具,可以根据给出的条件,自动对文本进行处理.在使用之前,需要知道的有三点:1. sed是逐行进行处理:2. sed不对原文件进行修改:3. sed默认是将处理后的内容打印到标准输 ...
- [Java 实现AES加密解密]
今天同学请教我这个问题,被坑了次…… 实现的功能是2个Java类:一个读取源文件生成加密文件,另一个类读取加密文件来解密. 整个过程其实很简单,java有AES的工具包,设好秘钥,设好输入内容,就得到 ...
- 创建与合并分支-git入门教程
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...
- PHP之:多图上传
撰写日期:2016-6-30 15:17:35 Thursday 参考 http://a3147972.blog.51cto.com/2366547/1381136 (08-05ThinkPHP+sw ...
- HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)
各浏览器对编码格式的支持情况 audio和video元素的属性介绍 1.src:媒体数据的URL地址 <video src="pr6.mp4"></video&g ...
- iOS - Runloop个人总结
调用堆栈: 程序运行之前,自上而下启动 iOS端用的所用系统framework都是动态链接的. dyld:The dynamic link editor 动态链接器
- DataReader和DataSet的异同
DataReader:使用时始终占用SqlConnection,在线操作数据库:每次只在内存中加载一条数据,所以占用的内存是很小的:是只进的. 只读的. DataSet:则是将数据一次性加载在内存中. ...
- winform的tab跳到下一个
先设置TabStop=true,再设置TabIndex的顺序
- accept()
在一个套接口接受一个连接.accept()是c语言中网络编程的重要的函数,windows系统在#include<winsock.h> ,而linux系统在#include <sys/ ...