Search code examples
.netvb.netviewstatepage-lifecycle

Viewstate does not persist after postback


I'm having some problems in persisting the viewstate on postback for a Control (vb.net)

here's some code i've put in my control:

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

But on every postback, the viewstate is empty again.

Update: What do i want to do? I want to store the time when the user first loads the page. Then, the user will do multiple postbacks. On every postback i need to know that time.

Update 2: Context:

  • An aspx page (Editor.aspx) will load a web control (ObjectsEditor.ascx) dynamicly
  • ObjectsEditor.ascx contains of a single custom control (Objects.vb)
  • Objects.vb will create another custom control (ObjectsContainer.vb) and add it to it's controls It is the ObjectsContainer that needs to persist the viewstate.

I'm setting EnableViewState = "true" everywhere i can, but still no result. Do i really need to set those properties here. (ViewStateMode and EnableViewState) If not, where should i handle this and what is the difference between those properties?

Many thanks.


Solution

  • I can't find why the viewstate did not persist after postback, but I've found another way to hold the value using the controlstate. Here's my implementation:

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

    Add the following overridden methods:

        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
    

    Give a value to the property in OnLoad

        Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
            If Not Page.IsPostBack Then
                SortTime = DateTime.Now
            End If
        End Sub
    

    Now i can call the property after the page has loaded and it will always have the value set on the first page load. It will not change on postback and it won't be gone on postback.

    I'm sure this is possible with the viewstate too, but for some reason, this was not working for me.

    Thanks for helping me to understand the Viewstate, I'm sure i'll have to use the viewstate sooner or later.