ASP.NET中实现页面间数据传递的方法

9次阅读

在做 WEB 开发时,很多地方会涉及到页面间的数据传递。这几天在完善教务基础系统,遇到了这个问题,上网查了一些资料,现总结如下:说到页面间数据传递,很多人都会想到通过像 Session 这样的全局变量,但是向 Session 中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好。
ASP.NET 页面间数据传递的各种方法和分析
1. 使用 Querystring 方法
QueryString 也叫查询字符串,这种方法将要传递的数据附加在网页地址 (URL) 后面进行传递。如页面 A.aspx 跳转到页面 B.aspx,可以用 Request.Redirect("B.aspx? 参数名称 = 参数值 ")方法,也可以用超链接:,页面跳转后,在目标页 面中可用 Ruquest[" 参数名称 "]来接收参数。使用 QuerySting 方法的优点是实现简单,不使用服务器资源; 缺点是传递的值会显示在浏览器的地址栏上,有被篡改的风险,不能传递对象,只有在通过 URL 请求页时查询字符串才是可行的。
2. 利用隐藏域
隐藏域不会显示在用户的浏览器中,一般是在页面中加入一个隐藏控件,与服务器进行交互时把值赋给隐藏控件并提交给下一页面。隐藏域可以是任何存储在网页中的与网页有关的信息的存储库。使用隐藏域存入数值时用:hidden 控件。value= 数值,取出接收数值时用:变量 =hidden 控件。value。使用隐藏域的优点是实现简单,隐藏域是标准的 HTML 控件,不需要复杂的编程逻辑。隐藏域在页上存储和读取,不需要任何服务器资源,几乎所有浏览器和客户端设备都支持具有隐藏域的窗体。缺点是存储结构少,仅 仅支持简单的数据结构,存储量少,因为它被存储在页面本身,所以无法存储较大的值,而且大的数据量会受到防火墙和代理的阻止。
3.ViewState
ViewState 是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性。使用 ViewState 传递数据时可用:ViewState [" 变量名 "]= 数值,在取出数据时用:变量 =ViewState[" 变量名 "]。使用 ViewState 的优点是:在对同一页的多个请求间自动保留值,不用服务器端资源,实现简单,视图状态中的值经过哈希计算和压缩,并且针对 Unicode 实现进行编码,其安全性要高于使用隐藏域; 缺点是因为 ViewState 存储在页面本身,因此如果
存储较大的值,用户显示页和发送页时的速度可能会减慢。虽然视图状态以哈希格式存储数据,但它仍可以被篡改。
4. 使用 Cookie
Cookie 可以在页面之间传递少量信息,可以存储在客户端的文本文件中,也可存储在客户端的内存中。Cookie 方法适用于存储少量页面中经常改动的信息,如为登陆过的网站保存登陆用户名,为用户输入提供方便,还有在一些用户自定义项目上保存用户的个性化设置。使用 Cookie 传递数据时可 用:Response.Cookies[" 键名 "]= 键值; 取出数据用:变量名 =Request.Cookies[" 键名 "]。使用 Cookie 优点是:Cookie 存储在客户端,不使用服务器资源,实现简单,可配置到期时间。缺点是:可以存储的数据量比较少,由于 Cookie 并不被所有的浏览器支持,而且还可能被用户禁止或删除,所以不能用于保存关键数据。另外,Cookie 保存的形式是简单的明文文本,在它里面不宜保存敏感的、未加密的 数据。
5. 使用 application 变量
使用 Application 变量也可以实现页面间的传值,Application 变量是全局性的,所有用户共享一个 Application 变量,一旦定义,它将影响到程序的所有部分。如果想在整个应用程序范围使用某个变量值 Application 对象将是最佳的选择。存入数据时,把值添加到 Application 变量里:Application[" 变量名 "]= 数值; 取出数据用:变量 =Application[" 变量名 "]; 在不需要使用该 Application 时,要显式清除它:Application[" 量名 "]=null。
Application 优点:易于使用,全局范围。可供应用程序中的所有页来访问。缺点:若保存数据的服务器端进程被损坏(如因服务器崩溃、升级或关闭而损坏),那么数据就会丢 失,所以利用 Application 一定要有保底的策略; 占用服务器端的内存,这可能会影响服务器的性能以及应用程序的可伸缩性。
6. 使用 session 变量
Session 对象可以用来存储需要维护的指定对话的信息,不同的客户端生成不同的 Session 对象。Session 用于存储特定于单独会话的短期信息。Session 的使用方法和格式与 Application 相同。
优点:易于实现,并且提供较高的安全性 和持久性,可以应对 IIS 重启和辅助进程重启,可在多进程中使用。缺点是耗用服务器端的内存。所以不要存储大量的信息。Session 最常见的用途是与 Cookie 一起向 Web 应用程序提供用户标识功能,Session 也可用于不支持 Cookie 的浏览器。但是,使用无 Cookie 的 Session 需要将会话标识符放置在查询字符串中,同样会遇到本文在查询字符串一节中陈述的安全问题。
7. 使用类的静态属性
这种方法是利用类的静态属性实现两个页面间的值传。定义一个包含静态属性的类; 将要传送的值赋给静态属性; 目标页面中可以通过静态属性获得源页面中要传的值。
优点是可以方便传送多个数据,缺点是需要额外编程,增加程序设计的工作量,占用服务器内存。
8. 使用 Server.Transfer
通过 Server.Transfer 方法把执行流程从当前的 ASPX 文件转到同一服务器上的另一个 ASPX 页面的同时,可保留表单数据或查询字符串,做法是把该方法的第二个参数设置成 True,在第一个页面用 Server.Transfer(" 目标页面 名.aspx",true); 目标页面取出数据用:Ruquest.Form[" 控件名称 "]或 Ruquest.QueryString[" 控件名 称 "]。Asp.net2.0 中还可以这样来用,代码如下:
PReviousPage pg1;
pg1=(PreviousPage)Context.Handler;
Response.Write(pg1.Name);
说明:此段代码用在目标页面中取出传递的值,Previous- Page 是原页面的类名,Name 是在原页面定义的属性,需要传递 的数据存入到此属性中。
使用这种方法,需要写一些代码以创建一些属性以便可以 在另一个页面访问它,可以在另一个页面以对象属性的方式来 存取数值,这个方法在页面间值传递中是特别有用的,这种方法 不但简洁,同时又是面向对象的。
9.Cache
Cache 具有强大的数据操作功能,以键值对集合的形式存 储数据,可以通过指定关键字来插入和检索数据项。它的基于依 赖性的终止功能,使它能够精确控制如何并及时更新和消除缓 存中的数据。它可以内部进行锁定管理,不需要象 Application 对象那样使用 Lock()和 Unlock()方法进行串行化管理。缺点是使用 方法较复杂,使用不当反而降低性能。
不同页面跳转情况下可采用的传值方法
1. 情况一:源页面可以跳转到目标页面,源页面传递数据给目标页面
使用查询字符串,将少量信息从一页传输到另一页以及不 存在安全性问题时,是一个简单常用的方法; 使用 Server.Transfer 方法,可传递表单数据或查询字符串到另一个页面,还可以 保存初始页的 HttpContext,当目标页和源页面在同一个服务器 时,可以用此方法。
2. 情况二:页面传递数值给自身页面
即在对同一页的多个请求间保留值,ViewState 属性可提供具有基本安全性的功能。也可用隐藏域,存储少量回发到自身或另一页的页信息时使用,不考虑安全性问题时使用。
3. 情况三:源页面传递数值给目标页面,而源页面不能直接连接到目标页面。
有多个方法,具体用哪个要看具体情况。
Application:存储由多个用户使用且更改不频繁的全局信息,此时安全性不成为问题。不要存储大量的信息。Session:存储特定于单独会话的短期信息,并且需要较高的 安全性。不要在会话状态中存储大量的信息。需要注意,将为应用程序中每一会话的生存期创建并维护会话状态对象。在支持许多用户的应用程序中,这可能会占用大量服务器资源并影响可缩放性。
Cookie:当您需要在客户端存储少量信息以及不存在安全性问题时使用。类的静态属性,方便传送多个数据。
Cache:对象用于单个用户、一组用户或所有的用户。可以为多个请求长时间、高效率的保存数据。上述几个方法,不仅用于情况三,前面两种情况都可以使用,只是没有必要时尽量少用,否则会造成资源浪费或增加程序的复杂性。
大家可以根据变量的作用域和项目的具体实际情况选择适当的方法。

正文完