Viewstate does not persist after postback

和自甴很熟 提交于 2020-01-05 14:58:21

问题


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.


回答1:


I see some correct answers here, but I don't see any detailed explanations, so I figured I would chime in:

ASP.NET has a fairly complicated request/response life-cycle. Each cycle runs through a set of events such as Init, Load, etc.. According to this article, and specifically this image, there is a method called TrackViewState() that executes after the Init event but before InitComplete event. This means that any changes to ViewState will not be persisted (tracked) if they are made in the Init event like the OP has done.

There is an additional method called LoadViewState() that takes the ViewState data that was posted via the __VIEWSTATE form value and loads it into the current ViewState collection. This executes after the InitComplete event but before the PreLoad event. Meaning that values already set to ViewState before LoadViewState() executes will likely be overwritten.

Now, knowing when these 2 events occur, and knowing the ViewState persistence methods that execute before and after them, we can deduce that the earliest event where it is safe to set ViewState values is the PreLoad event. Values set earlier than this event will likely be overwritten and thus not persisted.

So, to answer your question, set your ViewState value in the OnPreLoad() method or do as others have suggested and do it in the OnLoad() method and your values should be persisted.




回答2:


The page's ViewState will not be loaded until Load-event. So you can store your value but not reload it in OnInit.

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

Edit: To be honest, i'm yet not sure what causes your issue(and have not the time to investigate further), but try this way which works as expected:

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



回答3:


When a postback happens (i.e. when a form is submitted to a server), the variable values that are set in the code-behind page are erased from the memory of the client system

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




回答4:


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 

Write this code




回答5:


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.



来源:https://stackoverflow.com/questions/9802306/viewstate-does-not-persist-after-postback

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!