none
ViewState保存的数据非常奇怪的丢失了?vs2008本身的bug吗? RRS feed

  • 问题

  • 经过反复断点测试,找到了ViewState数据丢失的地方,就是在page_Load中,丢失,但是,我反复阅读了源码,并没有看出有什么逻辑上的错误
    DataSet ds = new DataSet();

    ds = run.GetDataSet("mxd_search '"+Request.QueryString["id"]+"'");
    this.get_title.Text = ds.Tables[0].Rows[0]["title"].ToString();//标题

    //明细单
    ds.Clear();
    ds = run.GetDataSet("get_info "+Request.QueryString["id"]+"");
    ViewState["MxTable"] = ds.Tables[0];
    ItemBind();

    //附件列表
    ds.Clear();//跟踪调式,发现执行该句后,ViewState["MxTable"] 的行记录就等于0啦
    ds = run.GetDataSet("select *,1 FileId,'附件' TypeName from tfile where id=" + Request.QueryString["id"] + "");
    ViewState["Fj_Table"] = ds.Tables[0];
    fjBind();

    ======================================
    以上代码,在反复调式过程中发现,只有ViewState["MxTable"] 会丢失,之前都有数据,显示为6行记录,但是,在执行到附件列表的ds.Clear()后,再检测,就发现ViewState["MxTable"] 行数就为0了,这是为什么?这些都是一个独立的过程,并不相关联的,怎么就会突然丢失了呢?哪位老大能否解释下为什么,该怎么修正?

    2010年3月4日 1:47

答案

  • 你好!

    这里就是常说的值类型与引用类型的区别。因为是引用类型所以你在 ViewState["MxTable"] 与 ds.Tables[0] 是同一对象,你 clear 时 ViewState["MxTable"] 自然也清空了。

    你把你的代码改为 ViewState["MxTable"] = ds.Tables[0].Copy(); 就可以了。



    知识改变命运,奋斗成就人生!
    • 已标记为答案 fangyanqin 2010年3月4日 2:08
    2010年3月4日 2:01
    版主

全部回复

  • 你好!

    这里就是常说的值类型与引用类型的区别。因为是引用类型所以你在 ViewState["MxTable"] 与 ds.Tables[0] 是同一对象,你 clear 时 ViewState["MxTable"] 自然也清空了。

    你把你的代码改为 ViewState["MxTable"] = ds.Tables[0].Copy(); 就可以了。



    知识改变命运,奋斗成就人生!
    • 已标记为答案 fangyanqin 2010年3月4日 2:08
    2010年3月4日 2:01
    版主
  • 谢谢您,为我解答。看来我要学的东西还很多啊。

    2010年3月4日 2:08