回发后Viewstate不会保留

时间:2012-03-21 10:05:14

标签: .net vb.net viewstate page-lifecycle

我在控件(vb.net)的回发上持久化视图状态时遇到一些问题

这里有一些我控制的代码:

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
            MyBase.OnInit(e)
            Me.EnableViewState = True
            Me.ViewStateMode = System.Web.UI.ViewStateMode.Enabled
            If Not Page.IsPostBack Then
                _SortTime = DateTime.Now
                _SortTime.AddSeconds(-10) ' incase the fileserver and webserver date are out of sync
                ViewState("PageLoadTimeStamp") = _SortTime      
            End If
        End Sub

的onload:

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)

        _SortTime = CType(ViewState("PageLoadTimeStamp"), DateTime)

End Sub

但是在每次回发中,视图状态都是空的。

更新:我想做什么? 我想存储用户首次加载页面的时间。然后,用户将进行多次回发。在每次回发中我都需要知道时间。

更新2:上下文:

  • aspx页面(Editor.aspx)将动态加载Web控件(ObjectsEditor.ascx)
  • ObjectsEditor.ascx包含单个自定义控件(Objects.vb)
  • Objects.vb将创建另一个自定义控件(ObjectsContainer.vb)并将其添加到其控件中 ObjectsContainer需要持久保存视图状态。

我在任何地方设置EnableViewState =“true”,但仍然没有结果。我真的需要在这里设置这些属性。 (ViewStateMode和EnableViewState)如果没有,我应该在哪里处理这些属性和这些属性之间的区别?

非常感谢。

5 个答案:

答案 0 :(得分:4)

我在这里看到了一些正确的答案,但我没有看到任何详细的解释,所以我想我会说:

ASP.NET具有相当复杂的请求/响应生命周期。每个周期都会运行一系列事件,例如InitLoad等。根据this article,特别是this image,有一个名为{{1}的方法在TrackViewState()事件之后但Init事件之前执行的事件。这意味着,InitComplete的所有更改都不会被保留(跟踪),如果它们是在OP已完成的ViewState事件中进行的。

还有一个名为Init的方法,它采用通过LoadViewState()表单值发布的ViewState数据,并将其加载到当前__VIEWSTATE集合中。这在ViewState事件之后但在InitComplete事件之前执行。这意味着在PreLoad执行之前已经设置为ViewState的值可能会被覆盖。

现在,知道这两个事件何时发生,并且知道在它们之前和之后执行的LoadViewState()持久性方法,我们可以推断出设置ViewState值是安全的最早事件是ViewState事件。早于此事件设置的值可能会被覆盖,因此不会保留。

因此,要回答您的问题,请在PreLoad方法中设置ViewState值,或按照其他人的建议进行操作,并使用OnPreLoad()方法执行此操作,并且应保留您的值。

答案 1 :(得分:1)

Load-event之前,不会加载页面的ViewState。因此,您可以存储您的值,但不能在OnInit中重新加载。

http://msdn.microsoft.com/en-us/library/ms972976.aspx

修改:说实话,我还不确定是什么原因引起了您的问题(并且没有时间进一步调查),但请尝试按预期方式运作:

Private Property SortTime As Date
    Get
        If ViewState("PageLoadTimeStamp") Is Nothing Then
            ViewState("PageLoadTimeStamp") = DateTime.Now.AddSeconds(-10)
        End If
        Return DirectCast(ViewState("PageLoadTimeStamp"), Date)
    End Get
    Set(value As Date)
        ViewState("PageLoadTimeStamp") = value
    End Set
End Property

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    MyBase.OnInit(e)
    'Me.EnableViewState = True
    'Me.ViewStateMode = System.Web.UI.ViewStateMode.Enabled
    'If Not Page.IsPostBack Then
    '    _SortTime = DateTime.Now
    '    _SortTime.AddSeconds(-10) ' incase the fileserver and webserver date are out of sync
    '    ViewState("PageLoadTimeStamp") = _SortTime
    'End If
End Sub

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    MyBase.OnLoad(e)
    Dim time = SortTime
    '_SortTime = CType(ViewState("PageLoadTimeStamp"), DateTime)
End Sub

答案 2 :(得分:0)

当回发发生时(即表单提交给服务器时),代码隐藏页面中设置的变量值将从客户端系统的内存中删除

http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/961985e8-37fe-4b0d-8eb9-9920e4b298d7/

答案 3 :(得分:0)

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    Me.EnableViewState = True
    Me.ViewStateMode = System.Web.UI.ViewStateMode.Enabled             
    If Not Page.IsPostBack Then
        _SortTime = DateTime.Now                 
        _SortTime.AddSeconds(-10) ' incase the fileserver and webserver date are out of sync                 
         ViewState("PageLoadTimeStamp") = _SortTime                   
    End If 
End Sub 

编写此代码

答案 4 :(得分:0)

我无法找到为什么viewstate在回发后没有保留,但我找到了另一种使用controlstate来保存值的方法。这是我的实施:

 Public Property SortTime() As DateTime
        Get
            Return _SortTime
        End Get
        Set(ByVal value As DateTime)
            _SortTime = value
        End Set
    End Property

添加以下重写方法:

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        Page.RegisterRequiresControlState(Me)
        MyBase.OnInit(e)
    End Sub

    Protected Overrides Function SaveControlState() As Object
        Return _SortTime
    End Function

    Protected Overrides Sub LoadControlState(ByVal savedState As Object)
        Dim state As DateTime = CType(savedState, DateTime)
        Me._SortTime = state
    End Sub

在OnLoad

中为属性赋值
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        If Not Page.IsPostBack Then
            SortTime = DateTime.Now
        End If
    End Sub

现在我可以在页面加载后调用属性,并且它将始终在第一页加载时设置值。它不会在回发时改变,也不会在回发时消失。

我确信这也适用于viewstate,但出于某种原因,这对我不起作用。

感谢您帮助我理解Viewstate,我相信我迟早要使用viewstate。