ASP跨页面数据传递问题

问题描述

一直是做j2ee的web开发,最近被迫着手一个asp.net(后台程序是vb.net)的项目,从来没有做过asp.net(只是过去有一点vb的经验),一时不知如何下手,但还是磕磕碰碰的完成了客户需要的demo(总算混过了关,哈哈)。在这几天如地狱般的demo开发过程中,不断地出现问题,每次出现问题都先想想java是怎么实现的,然后就去找asp.net有没有类似的方法。还好,web原理都是那么一套逻辑,很多问题都能顺利解决,只是页面与页面之间的数据传递问题,遇到麻烦,查了很多资料,都是老生常谈(大家你抄我来,我抄他),归结起来如下:1.用session来传递数据,但是每次都要手动去删除数据,要不session里的东西太多太乱,最后都不知道有什么没什么了,太不方便!2.加到url后面(类似?xxx=yyy&zzz=kkk),缺点是只能传递字符串类型的值,对于我们自定义的对象就不适用了我研究了一下,忽然想起原来做java的时候有一个本地线程东东,可以往里面放数据,只在本线程内使用,是线程安全的,估计.net也应该有类似的东东吧,查了一下找到了一个叫线程局部存储(TSL:ThreadLocalStorage)的技术,写了一点代码,测试了一下,基本满足了我需要的功能(页面之间传递无状态临时数据),以下是我的代码:创建一个全局常量定义类ConstString.vb------------------------------------------------------------------------------------ImportsMicrosoft.VisualBasicPublicClassConstStringPublicConstTHREAD_CACHE_INFOAsString="THREAD_CACHE_INFO"EndClass然后,在web工程内的Global.asax内加入启动和关闭web时,所需要执行的代码------------------------------------------------------------------------------------<%@ApplicationLanguage="VB"%><scriptrunat="server">SubApplication_Start(ByValsenderAsObject,ByValeAsEventArgs)System.Threading.Thread.AllocateNamedDataSlot(ConstString.THREAD_CACHE_INFO)EndSubSubApplication_End(ByValsenderAsObject,ByValeAsEventArgs)System.Threading.Thread.FreeNamedDataSlot(ConstString.THREAD_CACHE_INFO)EndSub…………略</script>编写了一个模拟HttpServletRequestsetAttribute方法和getAttribute方法的代理类------------------------------------------------------------------------------------ImportsMicrosoft.VisualBasicImportsSystem.ThreadingImportsSystem.CollectionsPublicClassThreadCachePublicSharedFunctiongetAttribute(ByValnameAsString)AsObjectDimhtAsHashtable=getCache()Returnht.Item(name)EndFunctionPublicSharedSubsetAttribute(ByValnameAsString,ByValvalueAsObject)DimhtAsHashtable=getCache()ht.Add(name,value)EndSubPrivateSharedFunctiongetCache()AsHashtableDimslotAsLocalDataStoreSlot=Thread.GetNamedDataSlot(ConstString.THREAD_CACHE_INFO)DimhtAsHashtable=Thread.GetData(slot)IfhtIsNothingThenht=NewHashtable()Thread.SetData(slot,ht)EndIfReturnhtEndFunctionEndClass以上代码完成后,你就可以在你的asp页面的后台处理程序中利用ThreadCache的getAttribute和setAttribute方法读取你自定义的数据了,用完后,不用作清理工作,它们将在你本次访问的线程结束时自动被清除另外必须提醒的一点是当你在asp后台代码中用Response.Redirect方法导航到其他asp页面去的时候,Response.Redirect方法的第二个参数一定要为False,这样才能保证前后两个asp是在一个thread中运行的,才能保证共享你利用ThreadCache加入的数据以上方法,不知道可行与否,请对.netframework精通的高手指点,非常感谢!

解决方案

解决方案二:
页面之间传值还可以使用Context上下文使用方法很简单,Context.add(key,value)
解决方案三:
UP
解决方案四:
在ASP中可以用URL重写啊!还可以直接跳转用Response.Redirect("**.aspx");然后可以把值放进Session里啊!
解决方案五:
你用线程Slot其实是很不安全的,asp.net不能保证一个Response.Redirect后还是原来那个线程,因为是客户端重定向重定向后不能保证还是原来的线程,如果这时候原来的线程被回收就没法取得了不过大多情况是,如果要用线程级别的静态变量可以实现你的需求,下面代码和你用slot是一样的;[ThreadStatic]staticintAbc;

不过更好的方法是Server.TransfePreviousPageType默认页publicpartialclass_Default:System.Web.UI.Page{DateTime_curTime;publicDateTimeCurTime{get{return_curTime;}}protectedvoidPage_Load(objectsender,EventArgse){_curTime=DateTime.Now;//使用类属性this.Context.Items["Now"]=_curTime;//使用Contextthis.Server.Transfer("~/default2.aspx");}}

接收的页面需要添加<%@PreviousPageTypeVirtualPath="~/Default.aspx"%>

代码中protectedvoidPage_Load(objectsender,EventArgse){this.TextBox1.Text=this.PreviousPage.CurTime.ToString();this.TextBox2.Text=Context.Items["Now"].ToString();}

第二种接收方法<%@ReferenceVirtualPath="~/Default.aspx"%>

protectedvoidPage_Load(objectsender,EventArgse){_Defaultdef=this.PreviousPageas_Default;this.TextBox1.Text=def.CurTime.ToString();this.TextBox2.Text=Context.Items["Now"].ToString();}

如果只需要取得Context.Items的话不用<%@Reference和<%@PreviousPageType就可以了;

时间: 2025-01-23 21:56:08

ASP跨页面数据传递问题的相关文章

七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MVC项目,本节的主要目标是了解MVC之间的数据传递问题.我们会逐步深入讲解,并添加新功能,使项目越来越完善. 系列文章 七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)--ASP.NET MVC 数据传递 七天学会ASP.NET MVC

ASP.NET页面之间传递参数的几种方法

  Asp.net页面之间传递参数的几种方法 第一种方法:通过URL链接地址传递 send.aspx: protected void Button1_Click(object sender, EventArgs e) { Request.Redirect("Default2.aspx?username=honge"); } receive.aspx: string username = Request.QueryString["username"]; 这样可以得到参

如何用js页面数据传递

问题描述 如何用js页面数据传递 ![!!图片说明如何用js把第一张输入框里的信息提取到第二张表格中 新手 解决方案 可以用session传递啊 解决方案二: 这个还是要用后台代码好点,,不然数据也保存不起来 解决方案三: js控制页面动态加载数据页面无刷新调用数据(IFRAME+js)JS页面间数据传递的各种方法和分析 解决方案四: var id = document.getElementById("input1");http://www.jb51.net/article/23763

Spring Mvc 入门之环境搭建与页面数据传递

SpringMVC(1)入门之环境搭建与页面数据传递 http://blog.163.com/zhangmihuo_2007/blog/static/27011075201452811058561/

ASP.NET 页面之间传递值方式优缺点比较_实用技巧

本题考查面试者对ASP.NET中多页面传值的理解是否全面.因为ASP.NET的页面表单提交到自身,完成回传的功能,所以默认情况下不能使用POST方式进行多页面传值.关于这些传值方式的分析如下所示.1.URL传值这是经典的传值方式,这种方法的使用非常简单,不过所传递的值是会显示在浏览器的地址栏上的,而且不能传递对象.所以这种方法一般用于传递的值少且安全性要求不高的情况下.在*.aspx页面开发中可以使用超级链接文本进行传值,如以下代码所示.<asp:HyperLink runat="serv

在两个ASP.NET页面之间传递值

asp.net|页面 引言 ASP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事情,在使用事件驱动编程模型的ASP.NET就不是那么容易了,当然了,我们仍然有一些方法可以实现同样的功能.本文将试着使用不同的可能的方法来解决这个问题,但可以预见是,本文将包含使用querystring,session变量以及server.Transfer方法来实现页面间

(转)列举ASP.NET 页面之间传递值的几种方式

1.使用QueryString,  如....?id=1; response. Redirect().... 2.使用Session变量.3.使用Server.Transfer.4.Application .5.<input type="hidden"></input> 6.数据库. 使用QueryString : 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏 览器的地址栏

ASP.NET页面间传递对象的另类方法

asp.net|对象|页面  我们知道,Asp.net在不同页面间传递对象的时候可以用Session来实现.现在我想介绍另外一种方法来达到目的.     主要思路:我们需要两个页面,一个Sender.aspx负责发送所需传递的对象,一个Receiver.aspx负责接受send过来的对象.Sender.aspx主要是运用了Server.Transfer来终止当前页面的执行,并开始调入Receiver.aspx来取出对象. 具体实现: ITransfer.cs namespace Sunrise.

在asp.net页面中传递中文参数

asp.net|页面|中文 1.设置web.config文件.     <system.web>       ......       <globalization   requestEncoding="gb2312"   responseEncoding="gb2312"   culture="zh-CN"   fileEncoding="gb2312"   />       ......