首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • ASP跨页面数据传递问题
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ricoco
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-19 14:27:42 楼主
    一直是做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: Thread Local Storage)的技术, 写了一点代码,测试了一下,基本满足了我需要的功能(页面之间传递无状态临时数据),以下是我的代码:

    创建一个全局常量定义类ConstString.vb
    ------------------------------------------------------------------------------------
    Imports Microsoft.VisualBasic
    Public Class ConstString
        Public Const THREAD_CACHE_INFO As String = "THREAD_CACHE_INFO"
    End Class

    然后,在web工程内的Global.asax内加入启动和关闭web时,所需要执行的代码
    ------------------------------------------------------------------------------------
    <%@ Application Language="VB" %>
    <script runat="server"> 
        Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
            System.Threading.Thread.AllocateNamedDataSlot(ConstString.THREAD_CACHE_INFO)
        End Sub 
        Sub Application_End(ByVal sender As Object, ByVal e As EventArgs) 
            System.Threading.Thread.FreeNamedDataSlot(ConstString.THREAD_CACHE_INFO)
        End Sub 
        …………略
    </script>

    编写了一个模拟HttpServletRequest setAttribute方法和getAttribute方法的代理类
    ------------------------------------------------------------------------------------
    Imports Microsoft.VisualBasic
    Imports System.Threading
    Imports System.Collections

    Public Class ThreadCache
        Public Shared Function getAttribute(ByVal name As String) As Object
            Dim ht As Hashtable = getCache()
            Return ht.Item(name)
        End Function
        Public Shared Sub setAttribute(ByVal name As String, ByVal value As Object)
            Dim ht As Hashtable = getCache()
            ht.Add(name, value)
        End Sub
        Private Shared Function getCache() As Hashtable
            Dim slot As LocalDataStoreSlot = Thread.GetNamedDataSlot(ConstString.THREAD_CACHE_INFO)
            Dim ht As Hashtable = Thread.GetData(slot)
            If ht Is Nothing Then
                ht = New Hashtable()
                Thread.SetData(slot, ht)
            End If
            Return ht
        End Function
    End Class

    以上代码完成后,你就可以在你的asp页面的后台处理程序中利用ThreadCache的getAttribute和setAttribute方法读取你自定义的数据了,用完后,不用作清理工作,它们将在你本次访问的线程结束时自动被清除
    另外必须提醒的一点是当你在asp后台代码中用Response.Redirect方法导航到其他asp页面去的时候,Response.Redirect方法的第二个参数一定要为False,这样才能保证前后两个asp是在一个thread中运行的,才能保证共享你利用ThreadCache加入的数据

    以上方法,不知道可行与否,请对.net framework精通的高手指点,非常感谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • S170393163
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-19 16:59:071楼 得分:0
    请用上下文 Context
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • purple_tide
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-19 17:16:072楼 得分:0
    上下文中的HttpContext 或者Session都不错
    你可以可以考虑用Cache

    或者用静态变量或者其他的也都可以啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wxg22526451
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-19 17:30:173楼 得分:0
    关注
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiangsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-21 21:51:124楼 得分:0
    可以存到hidden field或者cookie里面
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • amandag
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      5

    发表于:2008-05-21 22:09:235楼 得分:0
    如果数据非常多,IE浏览器支持一个userdata的东东,容量64kb,每个域名最多可存10个共计640k数据。默认保存在C:\Documents and Settings\Administrator\UserData\目录下,保存格式为xml。

    参考http://msdn.microsoft.com/library/default.asp?url=/workshop/author/behaviors/reference/behaviors/userdata.asp


    sessionStorage,firefox2支持的临时数据保存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • belldandy11
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-21 23:19:096楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cat_hsfz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-21 23:44:457楼 得分:0
    用ViewState来传递,因为这些数据属于View的状态,理所当然应该放在ViewState里面,进行CrossPagePostBack,然后就传递过去了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-22 08:08:118楼 得分:0
    用隐藏域就行!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved