过来看下HashTable、Session的值问题

jerrylyj 2010-01-11 02:08:01
头大了。。。

private Hashtable htResult = new Hashtable();

private Hashtable htTemp = new Hashtable();

private void AddV(string[] 数组)
{
for (int i = 0; i < 数组.Length; i++)
{//遍历选中的警员进行分析
if (!htTemp.ContainsKey(数组[i].ToString()))
{
Hashtable ht = Session["B"] != null ? Session["B"] as Hashtable : new Hashtable();
//查看下Session["B"]的内容
htTemp.Add(数组[i].ToString(), 数组[i].ToString());//不存在就添加
Hashtable ht1 = Session["B"] != null ? Session["B"] as Hashtable : new Hashtable();
//查看下Session["B"]的内容
}
}
Session["A"] = htTemp;//Session["A"]保存临时的哈希表
}
//最终的值保存在Session["B"]中

当执行AddV函数时,调用前两三次正常,调试跟踪,所有变量值都正常,
但是接着,,,
当调用多次的AddV函数后,当执行htTemp.Add(数组[i].ToString(), 数组[i].ToString());时,函数里面前后的ht和ht1的值居然不一样了,ht1的值居然跟htTemp值一样,每循环一次就被加了一次~~
晕了,调试了好久,跟踪了好久,根本找不到在哪里篡改了。怎么回事


UNDERSTAND?
...全文
245 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerrylyj 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jshi123 的回复:]
那取消时也应新建对象
//cancel
protected void Button4_Click(object sender, EventArgs e)
{
Session["B"] = httemp = new Hashtable(Session["A"] as Hashtable);
bandlb();
}

[/Quote]

it's OK
jshi123 2010-01-12
  • 打赏
  • 举报
回复
那取消时也应新建对象
//cancel
protected void Button4_Click(object sender, EventArgs e)
{
Session["B"] = httemp = new Hashtable(Session["A"] as Hashtable);
bandlb();
}
jerrylyj 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jshi123 的回复:]
引用 18 楼 jerrylyj 的回复:
呵呵,问题和我差不多了,你的代码第一次正常,接下来就不正常了


什么问题?测试数据是怎样的?
[/Quote]
比如:
第一次插入1 、1111---结果是1111
第二次插入2、2222---结果是1111、2222
然后确定
第三次再插入3、3333---结果是1111、2222、3333
然后按取消
会变到-----结果是1111、2222(3333被取消掉了)
以上是正常的
第四次,再插入4、4444----结果是1111、2222、4444
然后按取消----结果是1111、2222、4444(4444是不应该出现的,因为上次确定只保存了1、2)
呵呵


我已经用别的解决方案了,用HiddenField代替了。。。。
不过这个问题我也想知道why~~~~
jshi123 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jerrylyj 的回复:]
呵呵,问题和我差不多了,你的代码第一次正常,接下来就不正常了
[/Quote]

什么问题?测试数据是怎样的?
狼王_ 2010-01-12
  • 打赏
  • 举报
回复
jerrylyj 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jshi123 的回复:]
protected void Button2_Click(object sender, EventArgs e)
{
    Session["A"] = new Hashtable(httemp);
    bandlb();
}

//cancel
protected void Button4_Click(object sender, EventArgs e)
{
    Session["B"] = httemp = (Hashtable)Session["A"];
    bandlb();
}

[/Quote]
呵呵,问题和我差不多了,你的代码第一次正常,接下来就不正常了
happy664618843 2010-01-12
  • 打赏
  • 举报
回复
不明白意思 帮顶
jshi123 2010-01-11
  • 打赏
  • 举报
回复
protected void Button2_Click(object sender, EventArgs e)
{
Session["A"] = new Hashtable(httemp);
bandlb();
}

//cancel
protected void Button4_Click(object sender, EventArgs e)
{
Session["B"] = httemp = (Hashtable)Session["A"];
bandlb();
}
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复

<body>
<form id="form1" runat="server">
<div>

</div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click"
Text="添加到listbox" />
<asp:Button ID="Button2" runat="server" Text="最终确定添加到listbox的内容"
onclick="Button2_Click" />
<asp:Button ID="Button4" runat="server" onclick="Button4_Click"
Text="取消(恢复到上去确定)" />
<br />
<asp:ListBox ID="ListBox1" runat="server" Height="283px" Width="207px">
</asp:ListBox>
</form>
</body>



private Hashtable httemp;
private Hashtable ht;

protected void Page_Load(object sender, EventArgs e)
{
httemp = (Session["B"] != null) ? Session["B"] as Hashtable : new Hashtable();
if (!IsPostBack)
{
Session["A"] = null;//最终
Session["B"] = null;//temp
httemp=new Hashtable();
ht = new Hashtable();
}
}


protected void Button1_Click(object sender, EventArgs e)
{
if (!httemp.ContainsKey(this.TextBox1.Text))
{
httemp.Add(this.TextBox1.Text, this.TextBox2.Text);
}
Session["B"] = httemp;
bandlb();
}

//ok
protected void Button2_Click(object sender, EventArgs e)
{
Session["A"] = httemp;
bandlb();
}

//cancel
protected void Button4_Click(object sender, EventArgs e)
{
httemp = (Hashtable)Session["A"];
bandlb();
}

private void bandlb()
{
this.ListBox1.DataTextField = "value";
this.ListBox1.DataValueField = "key";
this.ListBox1.DataSource = httemp;
this.ListBox1.DataBind();
}

jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
Hashtable ht = Session["B"] != null ? Session["B"] as Hashtable : new Hashtable();
换成
if( Session["B"] is Hashtable)

{

ht = (Hashtable)Session["B"] ;

}

依然饭特稀
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jshi123 的回复:]
Hashtable ht = Session["B"] != null ? Session["B"] as Hashtable : new Hashtable();
楼主认为这个是新建还是指向原有对象?

如果有些概念性问题不解决,换别的方案恐怕也只能解决一时问题

[/Quote]
哦~~,哎,好像有点味道了
是这边的问题吗,但前几次的测试怎么就正常了,后面才不正常呢。。。我在跟踪下
jshi123 2010-01-11
  • 打赏
  • 举报
回复
Hashtable ht = Session["B"] != null ? Session["B"] as Hashtable : new Hashtable();
楼主认为这个是新建还是指向原有对象?

如果有些概念性问题不解决,换别的方案恐怕也只能解决一时问题
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
实在不行,只能用别的解决方案了。。。不能吊死的这里
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jshi123 的回复:]
这样是看不出问题的,
如果htTemp和Session["B"]指向的是同一个Hashtable对象,那么ht,ht1当然是同htTemp一样的,
实际上htTemp,Session["B"],ht,ht1统统指向同一内存hashtable对象

[/Quote]
???
对象都新建的啊,怎么会指向同一内存对象。。。
还有,我执行过程中,我是测试了多次调用AddV这个函数,前几次是正常的,但接下来就不正常,就是这样才头大
What a fucking code
jshi123 2010-01-11
  • 打赏
  • 举报
回复
这样是看不出问题的,
如果htTemp和Session["B"]指向的是同一个Hashtable对象,那么ht,ht1当然是同htTemp一样的,
实际上htTemp,Session["B"],ht,ht1统统指向同一内存hashtable对象
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
对了。。。我是用ajax做的,但这不影响的啊
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
beniao277 2010-01-11
  • 打赏
  • 举报
回复
:)没看懂
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
代码是我整理下过发上来的,源代码比这个多,但重要的地方是一样的
jerrylyj 2010-01-11
  • 打赏
  • 举报
回复
就是在执行循环时,ht和ht1的值不一样了,但程序中根本没有去改变过Session["B"]的值啊。
Session["B"]的值只在一个地方改变,就是流程完成后确定,才会将htTemp 送到Session["B"]中的。。。。
所以。。。不知道循环体中的Session["B"]是怎么被篡改的
加载更多回复(4)

62,046

社区成员

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

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

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

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