仅仅是从session中取出数据也会修改session?

kukumaiwu 2011-11-15 09:02:56
求各位高人解答困惑:

我的画面上有一个gridview
当前画面从session中取得上个画面传的一个类CfmListParam的值
执行了sql检索后进行榜定
之后gridview中可以对内容进行修改
之后点保存按钮后将各条被选中的数据进行更新

部分代码如下:
Page_Load中

cfmLstParam = Nothing
cfmLstParam = New CfmListParam
cfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
ilstCfmLst = Mapper.Instance().QueryForList("ConfirmStatus_SQL-CONFIRM-1", cfmLstParam)
Me.grdStatusList.DataSource = ilstCfmLst
Me.grdStatusList.DataBind()

btnSave_Click中

For i As Integer = 0 To grdStatusList.Rows.Count - 1
If DirectCast(grdStatusList.Rows(i).FindControl("grdChkStatus"), CheckBox).Checked Then
cfmLstParam = Nothing
cfmLstParam = New CfmListParam
CfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
CfmLstParam.ER1No = DirectCast(grdStatusList.Rows(i).FindControl("grdLblER1No"), Label).Text
CfmLstParam.ER2No = DirectCast(grdStatusList.Rows(i).FindControl("grdLblER2No"), Label).Text
CfmLstParam.StatusFlg = DirectCast(grdStatusList.Rows(i).FindControl("grdCbStatus"), DropDownList).SelectedValue
CfmLstParam.Eng3Flg = DirectCast(grdStatusList.Rows(i).FindControl("grdLblEng3Flg"), Label).Text
CfmLstParam.EngCode = DirectCast(grdStatusList.Rows(i).FindControl("grdLblEngCode"), Label).Text
CfmLstParam.RfmPsnlNo = DirectCast(grdStatusList.Rows(i).FindControl("grdLnkRfmPsnlNo"), LinkButton).Text
CfmLstParam.PMNo = DirectCast(grdStatusList.Rows(i).FindControl("grdLblPMNo"), Label).Text
Mapper.Instance().Update("ConfirmStatus_SQL-UPDATE-CONFIRM-ERM-1", CfmLstParam)
If DirectCast(grdStatusList.Rows(i).FindControl("grdHdnPMUpdateFlg"), HiddenField).Value = "1" Then
Mapper.Instance().Update("ConfirmStatus_SQL-UPDATE-CONFIRM-PMG-1", CfmLstParam)
End If
updateNum += 1
End If
Next


其他不相关的代码均省略

现在我的困惑是
当我执行了保存操作后
session中的ConfirmStatus内容同时发生了变化
这是为什么呢?
...全文
341 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kukumaiwu 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sandy945 的回复:]
就是说要页面传值 ,传的还是文本

那post 再合适不过了
[/Quote]
修改ok了
多谢各位的回答!!
阿非 2011-11-15
  • 打赏
  • 举报
回复
就是说要页面传值 ,传的还是文本

那post 再合适不过了
kukumaiwu 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sandy945 的回复:]
request 的话 你要对保存的对象进行序列化

然后再反序列化,更繁琐.

你说下你要做什么事吧 我看你的代码中,没有用session 中的对象作什么事情
[/Quote]
呵呵,其实存取hashtable的方法已经有写过
只是pm要求用session
然后就改了

要做什么的话
其实就是无非上个画面的检索条件保持住
当本画面有更新并且保存后
页面重新根据上一个页面的检索key来提交一次实现同步更新

[Quote=引用 12 楼 kkbac 的回复:]
如果多读一次数据库可以解决,就多读一次数据库吧, 这样大的数据量尽量不用session保存吧.
[/Quote]
我也有想过
不过这个是个内部系统
所以可能实际传递和保存内容不会太多
yzf86211861 2011-11-15
  • 打赏
  • 举报
回复
学习下 session 我一般 我只放 临时数据。看看 大牛的用法。
kkbac 2011-11-15
  • 打赏
  • 举报
回复
如果多读一次数据库可以解决,就多读一次数据库吧, 这样大的数据量尽量不用session保存吧.
阿非 2011-11-15
  • 打赏
  • 举报
回复
request 的话 你要对保存的对象进行序列化

然后再反序列化,更繁琐.

你说下你要做什么事吧 我看你的代码中,没有用session 中的对象作什么事情

kukumaiwu 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kkbac 的回复:]
如果保存一个拷贝也可以, 不过比较复杂. 或者你可以换一种思考办法.
[/Quote]
或者你可以换一种思考办法.
请问还有什么更好的建议吗?
还是说不使用session而使用request方法?
格桑花 2011-11-15
  • 打赏
  • 举报
回复
仅仅从session中取出数据是不会对session进行修改的,你的代码里应该是有修改的地方才会出现变化的
kukumaiwu 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wang_yu_ru 的回复:]
当你的数据更新之后,你的Me.grdStatusList.DataSource=(他)cfmLstParam 重新绑定了,
而 cfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
session中的ConfirmStatus 是等于cfmLstParam 这个集合的,所内容同时发生了变化。
说白了,就是刷新之后重新……
[/Quote]
多谢说明!
确实有怀疑是这个问题
[Quote=引用 6 楼 sandy945 的回复:]
因为你存的数据是引用类型,访问的是同一实例.

你应该创建副本,根据需要进行 深复制/浅复制
[/Quote]
问题大致了解了
深复制前复制只是稍微看过一点文章
先自己研究一下了
多谢拉!~
kkbac 2011-11-15
  • 打赏
  • 举报
回复
如果保存一个拷贝也可以, 不过比较复杂. 或者你可以换一种思考办法.
阿非 2011-11-15
  • 打赏
  • 举报
回复
因为你存的数据是引用类型,访问的是同一实例.

你应该创建副本,根据需要进行 深复制/浅复制
wang_yu_ru 2011-11-15
  • 打赏
  • 举报
回复
当你的数据更新之后,你的Me.grdStatusList.DataSource=(他)cfmLstParam 重新绑定了,
而 cfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
session中的ConfirmStatus 是等于cfmLstParam 这个集合的,所内容同时发生了变化。
说白了,就是刷新之后重新绑定的时候,你有重新给session中的ConfirmStatus赋值了.
kukumaiwu 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kkbac 的回复:]
session保存引用类型的时候, 只保存其引用,
当这个变量发生变化的时候. session会跟着变化, 和一般的引用类型赋值一样.
[/Quote]

只保存地址么?
也就是说
必须保存一份拷贝?
kukumaiwu 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hch126163 的回复:]
自己调试!!

session 是引用类型
[/Quote]

没调试过我也不会来问的

咱真心求教

不打算回答的请勿费唇舌
kkbac 2011-11-15
  • 打赏
  • 举报
回复
session保存引用类型的时候, 只保存其引用,
当这个变量发生变化的时候. session会跟着变化, 和一般的引用类型赋值一样.
hch126163 2011-11-15
  • 打赏
  • 举报
回复
自己调试!!

session 是引用类型

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧