viewstate中的属性在一个页面上是不同的

时间:2013-08-12 14:25:28

标签: asp.net vb.net viewstate

这是非常奇怪的错误,我会尽力解释。

我有两页 - 第1页(表格)和第2页(已完成的页面)

从第1页开始,我将一个变量放入数据库,然后像第二页一样将server.transfer转到第二页......

Server.Transfer("Page2.aspx", True)

在第2页,我然后获取名为paymentOnHold的变量,该变量在第1页上设置并进入数据库......

以下是我在第1页

上设置paymentOnHold的方法
Public Property paymentOnHold() As String
    Get
        Dim _paymentOnHold As Object = ViewState("paymentOnHold")
        If _paymentOnHold IsNot Nothing Then
            Return CType(_paymentOnHold, String)
        Else
            Return Nothing
        End If
    End Get
    Set(ByVal value As String)
        If Not String.IsNullOrEmpty(value) Then
            ViewState("paymentOnHold") = value
        Else
            ViewState("paymentOnHold") = Nothing
        End If
    End Set
End Property

...

paymentOnHold = Date.Now.ToString("yyyyMMddHHmmss")

以下是我抓住第2页的价值......

Dim myValue As String

 If TypeOf PreviousPage Is Page1 Then

        myValue = DirectCast(PreviousPage, Page1).paymentOnHold

End If

在我的数据库是本地的开发环境中,数据库中的值和第2页上的值都匹配 - 正如您所期望的那样......

在实时环境中,DB值与第2页上的数据库不同(之前)3或4秒 - 即使我没有重置它或任何东西?

这让我在过去的几个小时里疯狂了,无法正常工作。

有没有人对可能导致这种情况的原因有什么想法/建议?

提前致谢

2 个答案:

答案 0 :(得分:1)

以这种方式使用ViewState是一个脆弱的解决方案,因为ViewState并不打算存在于它所启动的页面范围之外,更不用说在页面之间传递了,我意识到你并没有做到这一点,但你正在危险地接近这样做。

更好的方法是使用Session缓存,因为它旨在按用户存在并跨越多个页面请求。

试试这个:

要存储在Session中,请执行以下操作:

Session("PaymentOnHold") = [Date].Now.ToString("yyyyMMddHHmmss")

要从Session检索值,请执行以下操作:

' First check to see if the value is in Session cache or not
If Session("PaymentOnHold") IsNot Nothing Then
    ' Everything in Session cache is stored as an object so you need to cast it to get it out
    Dim datePaymentOnHold As DateTime = TryCast(Session("PaymentOnHold"), DateTime)
End If

现在无论您如何导航到网页(SessionServer.Transfer),Response.Redirect值都可用。

答案 1 :(得分:1)

这可能是在第一页(表单1)

中保存视图状态的问题

在asp.net页面生命周期

  1. Initalization (controls raise their Init event)
  2. Load ViewState (Only on post back)
  3. Load PostbackData 
  4. Load
  5. Raise PostbackEvent
  6. Save View State
  7. Render

Server.Transfer()停止渲染当前页面并开始渲染另一个页面。这就是为什么Server.Transfer()不能用于重定向到另一台服务器所服务的页面的原因。

如果你在Event之前做Server.transfer - > 6.保存视图状态您没有在窗体1上保存视图状态

<强>解决方案

Response.redirect和会话缓存,因为它旨在存在于每个用户和应用程序中的多个页面。