日期:2014-05-18  浏览次数:20397 次

当右键刷新时,为什么ViewState的值会丢失?
我在Page_Load里取得session中的值,把值保存到ViewState,然后清除session,但当我点击右键刷新时,ViewState的值却丢失了,如何能清除session而且当页面刷新时还能保留住原有的值,ViewState能做到吗?还请各位高手赐教。代码如下:

  If Not IsNothing(Session.Item("Item_1")) Then
  ViewState("2030") = Session.Item("Item_1")
  Session.Remove("Item_1")
  End If
  Dim f As String = ViewState("2030")

------解决方案--------------------
做不到。
不明白为什么要清除session
------解决方案--------------------
或许你可以把seesion的值附加到url后边,不用viewstate
------解决方案--------------------
做不到ViewState回发后保存内容
刷新后就没了

一定要用ViewState就象办法只回发不刷新
------解决方案--------------------
ViewState 只在postback的过程中持久化。
------解决方案--------------------
“右键刷新”时,浏览器拿出上一次页面提交的数据重复提交,这其中就包括上一个页面提交时的ViewState值。

我看不出你的“把值保存到ViewState”的道理。这是错误的举措。如果你为了解决“Session丢失”问题,那么应该使用“状态服务器”管理应用程序状态,或者放弃Session自己写代码把页面值写入数据库或者xml文件(当然此时要区分SessionID来区分不同的客户端会话)。

ViewState是页面状态,Session是会话状态,一个会话中可能有1个或者无数个页面,页面触发的顺序不定。把Session数据保存到ViewState中从逻辑上就错误了。
------解决方案--------------------
VB.NET code

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsNothing(Session.Item("Item_1")) Then
            ViewState("2030") = Session.Item("Item_1")
            Session.Remove("Item_1")
        End If
        Dim f As String = ViewState("2030")
        Response.Write(f)
    End Sub

    Protected Sub SetSession()
        Session("Item_1") = "ttt"
    End Sub