ASP.NET页面间传输数据的几种方法研究
摘要:与ASP相比,ASP.NET为程序开发者提供了很好的事件驱动开发模式。但是,当我们在多个Web页面间传递数据时,ASP.NET 却无法像ASP那样通过POST方法简单地实现Web页面间的数据传输。在现有的许多文章中,介绍了一些解决方法,但是都不是很全面。在借鉴别人研究的基础上,参照ASP.NET框架介绍的几种补充机制对ASP.NET页面间传输数据的方法进行了归纳和总结。
关键词:ASP.NET;数据传输;变量
asp网站页面
由于HTTP 是无状态的协议,所以没有必要在HTTP (Web)服务器上存放每个请求或用户的信息,在默认情况下,同一个用户的多次请求被看作是一系列非关联的单个请求。事实上,服务器没有“用户”这样的概念。如果需要通过请求次数管理用户或应用相关的数据,则需要通过管理策略自行管理。本文探讨的主要是为Web开发人员提供客户端与服务器端的通信解决方案:①隐式表单;②查询字符串;
③UrlData;④Cookies;⑤会话变量;⑥应用程序变量;⑦高速缓存。
当然,每种方法都有它的利弊,开发人员可以根据自己的不同需要选择使用。
1 隐式表单
可以使用将隐藏的字段添加到窗体表单中,对于用户来说,他们是不可见的,因此用户不能够直接在隐藏字段中输入值。但是,如果是一个开发者则可以从客户端和服务器端代码设置它们的值。需要注
意的是,虽然隐藏的字段对于用户来说是不可见的,但是这并不代表它是安全的。因为数据的存储和传输都是纯文本格式(除非开发人员自己进行加密),这就意味着浏览者可以通过浏览器访问HTTP源代码。因此,这种方法不适用于存储敏感数据。
2 查询字符串
使用QueryString实现页面间的数据传递,就是把要查询的值添加到浏览器的地址栏里,用?符号隔开,如下所示:
例如:http://www.jsyzsx?name1=value1&name2=value2&name3=value3
每个待查的值都是用&符号隔开,从Page.Request.QueryString 集合中获取到值,通常情况下,使用QueryString的超链接是从代码中动态生成的。这种方法的优点是非常简单,其缺点也是显而易见的,那就是页面间传递的数据会出现在目标页面的地址栏里,安全性得不到保障,因此,这种方法仅适用于安全要求不高的少量数据传递的操作,同时也不适用于对象的传递。
3 UrlData
UrlData是唯一的Web页的框架,类似于QueryString,UrlData 是URL的一部分。在下面的示例中,被请求的页是UrlData.cshtml,3个值value1、value2 和value3被添加到URL,如下:http://www.jsyzsx/UrlData/value1/value2/value3。UrlData 值将被视为一个集合,在集合中值被它们的索引引用。在本文下面的示例中,包含UrlData 的超链接是动态生成的:
UrlData
href="/ReadUrlData/@DateTime.Now.Day/@DateTime.Now.Month/@D ateTime.Now.Minute">Click to read UrlData
在ReadUrlData.cshtml 中的代码获取值:
@for (var i = 0;i < UrlData.Count();i++){
UrlData[@i] is @UrlData[i]
}
生成的网址是http://localhost:4954/ReadUrlData/21/7/43(7月21日上午7:43),输出的代码为:
UrlData[0]是21
UrlData[1]是7
UrlData[2]是434 Cookies
Cookies是浏览器和Web服务器与每个请求之间传递的碎片,它们的值可以存在于站点中的任何页面。Cookies通常用于存储用户首选项,帮助网站记住要打开或关闭,也可以用来记录当前用户已通过身份验证,并允许访问网站的限制区域。浏览器的工作是把客户机上的Cookies以文本文件的格式进行存储,存储期限是由Cookies类型和终止时间所决定的,没有终止时间的Cookies不会被存储在客户机上,它会在该用户的会话结束时被清除。
创建或设置一个cookie:
Response.Cookies["myCookie"].Value = "some cookie value";
用户会话继续时,可以读取cookie的值:
string cookieValue = Request.Cookies["myCookie"].Value;
对于单个值的cookie,可以通过使用子项,添加多个值到cookie:Response.Cookies["myCookie"]["user"] = "hinga";
Response.Cookies["myCookie"]["role"] = "admin";
针对一个cookie,可以设置终止时间。在这里,我们cookie的终止时间设为从现在起的后6个月:Response.Cookies["myCookie"].Expires = DateTime.Now.AddMonths (6);
Cookies必须是小于4Kb的纯文本格式,所以它们不适合存放大容量或者敏感数据。
5 会话变量
会话状态提供了一种机制,可以允许在一段有限的会话时间内同时联系来自同一个用户的请求,可以存储用户相关的值并在会话过程中的任何阶段进行检索。默认情况下,当用户第一次访问站点时会话开始,到最后一个请求结束后持续20分钟。会话变量可以是任何数据类型的字符串集合。当该项目存储在会话中时,它存储为一个对象的数据类型。下面的代码将演示如何设置两个会话变量:Session["myName"]="Hinga";
ArrayList myList=new ArrayList {"a","b","c","d" };
Session["myListString"]=myList;
对象和字符串之间可以进行隐式转换,但在对象和ArrayList之
间则不可以进行,当引用对话值时需要在实现对象与ArrayList间进行隐式强制转换:
string myName = Session["myName"];
ArrayList myList = (ArrayList)Session["myList"];
可以设置除AppStart文件中或在Global.asax中的Application_Start和Application_BeginRequest事件的任意位置的会话变量。与会话相关的所有数据都存储在内存中的服务器上,因此它并不安全,因为应用程序池回收和其它事件都会导致会话意外终止,所以应该检查以确保在尝试访问它们的值之前会话变量不为空,或者检查每个请求,如下所示:
if(Session["myName"] == null)
Session["myName"] = "Hinga";
如果上面的代码放置在该站点的根目录中的PageStart 文件中,则可以确保填充["myName"] 会话。由于会话变量存储在服务器上的内存中,应该知道有多少数据存储在内存中。如果是在共享主机上,将受限于应用程序可以使用的内存量。如果突破了能够使用的上限,应用程序池将自动回收资源,清空出任何存储在内存中的数据。会话变量是一个用来存储敏感数据的较好地方(如密码),但是,也应该防止恶意用户劫持会话。
6 应用程序变量
应用程序变量被称为全局变量,一旦设置,它们可用于所有用户和页面,就像会话变量,应用程序变量存储在AppState中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。