0、引言
web 页面是无状态的, 服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留。在用asp.net 设计开发一个web系统时, 遇到一个重要的问题是如何保证数据在页面间进行正确、安全和高效地传送,asp.net 提供了状态管理等多种技术来解决保存和传递数据问题,以下来探讨.net 下的解决此问题的各种方法和各自的适用场合。
1、数据传递的各种方法和分析
1.1 使用querystring 方法
querystring 也叫查询字符串, 这种方法将要传递的数据附加在网页地址(url)后面进行传递。如页面a.aspx 跳转到页面b.aspx,可以用request.redirect("b.aspx?参数名称=参数值")方法,也可以用超链接:,页面跳转后,在目标页面中可用ruquest["参数名称"]来接收参数。使用querysting 方法的优点是实现简单,不使用服务器资源;缺点是传递的值会显示在浏览器的地址栏上,有被篡改的风险,不能传递对象,只有在通过url 请求页时查询字符串才是可行的。
1.2 利用隐藏域
隐藏域不会显示在用户的浏览器中, 一般是在页面中加入一个隐藏控件, 与服务器进行交互时把值赋给隐藏控件并提交给下一页面。隐藏域可以是任何存储在网页中的与网页有关的信息的存储库。使用隐藏域存入数值时用:hidden 控件.value=数值,取出接收数值时用:变量=hidden 控件.value。使用隐藏域的优点是实现简单, 隐藏域是标准的html 控件,不需要复杂的编程逻辑。隐藏域在页上存储和读取,不需要任何服务器资源,几乎所有浏览器和客户端设备都支持具有隐藏域的窗体。缺点是存储结构少,仅仅支持简单的数据结构,存储量少,因为它被存储在页面本身,所以无法存储较大的值,而且大的数据量会受到防火墙和代理的阻止。
1.3 viewstate
viewstate 是由asp.net 页面框架管理的一个隐藏的窗体字段。当asp.net 执行某个页面时,该页面上的viewstate 值和所有控件将被收集并格式化成一个编码字符串, 然后被分配给隐藏窗体字段的值属性。使用viewstate 传递数据时可用:viewstate [" 变量名"]=数值,在取出数据时用:变量=viewstate["变量名"]。使用viewstate 的优点是:在对同一页的多个请求间自动保留值,不用服务器端资源,实现简单,视图状态中的值经过哈希计算和压缩,并且针对unicode 实现进行编码,其安全性要高于使用隐藏域;缺点是因为viewstate 存储在页面本身,因此如果存储较大的值,用户显示页和发送页时的速度可能会减慢。虽然视图状态以哈希格式存储数据,但它仍可以被篡改。
1.4 使用cookie
cookie 可以在页面之间传递少量信息, 可以存储在客户端的文本文件中,也可存储在客户端的内存中。cookie 方法适用于存储少量页面中经常改动的信息, 如为登陆过的网站保存登陆用户名,为用户输入提供方便,还有在一些用户自定义项目上保存用户的个性化设置。(www.jb200.com 脚本学堂)
使用cookie传递数据时可用:response.cookies["键名"]=键值;取出数据用:变量名=request.cookies["键名"]。使用cookie 优点是:cookie 存储在客户端, 不使用服务器资源,实现简单,可配置到期时间。缺点是:可以存储的数据量比较少,由于cookie 并不被所有的浏览器支持,而且还可能被用户禁止或删除,所以不能用于保存关键数据。另外,cookie 保存的形式是简单的明文文本,在它里面不宜保存敏感的、未加密的数据。
1.5 使用application 变量
使用application 变量也可以实现页面间的传值,application变量是全局性的,所有用户共享一个application 变量,一旦定义,它将影响到程序的所有部分。如果想在整个应用程序范围使用某个变量值application 对象将是最佳的选择。存入数据时, 把值添加到application 变量里:application["变量名"]=数值;取出数据用:变量=application["变量名"];在不需要使用该application 时,要显式清除它:application["量名"]=null。
application 优点:易于使用,全局范围。可供应用程序中的所有页来访问。缺点:若保存数据的服务器端进程被损坏(如因服务器崩溃、升级或关闭而损坏),那么数据就会丢失,所以利用application 一定要有保底的策略;占用服务器端的内存,这可能会影响服务器的性能以及应用程序的可伸缩性。