Viewstate не сохраняется после обратной передачи - PullRequest
1 голос
/ 21 марта 2012

У меня проблемы с сохранением состояния представления при обратной передаче для элемента управления (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) будет динамически загружать веб-элемент управления (ObjectsEditor.ascx)
  • ObjectsEditor.ascx содержит один пользовательский элемент управления (Objects.vb)
  • Objects.vb создаст другой пользовательский элемент управления (ObjectsContainer.vb) и добавит его в свои элементы управления. Это ObjectsContainer, который должен сохранять состояние представления.

Я устанавливаю EnableViewState = "true" везде, где могу, но все равно безрезультатно. Мне действительно нужно установить эти свойства здесь. (ViewStateMode и EnableViewState) Если нет, где я должен это обрабатывать и в чем разница между этими свойствами?

Большое спасибо.

Ответы [ 5 ]

4 голосов
/ 24 марта 2016

Я вижу некоторые правильные ответы здесь, но я не вижу подробных объяснений, поэтому я решил, что я бы включил:

ASP.NET имеет довольно сложный жизненный цикл запросов / ответов. Каждый цикл проходит через набор событий, таких как Init, Load и т. Д. Согласно этой статье , и конкретно этому изображению , существует метод под названием TrackViewState() выполняется после события Init, но до события InitComplete. Это означает, что любые изменения в ViewState не будут сохраняться (отслеживаться), если они сделаны в событии Init, как это сделал OP.

Существует дополнительный метод, называемый LoadViewState(), который берет данные ViewState, которые были отправлены через значение формы __VIEWSTATE, и загружает их в текущую коллекцию ViewState. Это выполняется после события InitComplete, но до события PreLoad. Это означает, что значения, уже установленные до ViewState до выполнения LoadViewState(), скорее всего будут перезаписаны.

Теперь, зная, когда происходят эти 2 события, и зная методы постоянства ViewState, которые выполняются до и после них, мы можем сделать вывод, что самым ранним событием, в котором можно безопасно установить значения ViewState, является событие PreLoad , Значения, установленные ранее этого события, вероятно, будут перезаписаны и, следовательно, не будут сохранены.

Итак, чтобы ответить на ваш вопрос, установите значение ViewState в методе OnPreLoad() или сделайте так, как предлагали другие, и сделайте это в методе OnLoad(), и ваши значения должны быть сохранены.

1 голос
/ 21 марта 2012

Страница ViewState не будет загружена до Load -event .Таким образом, вы можете сохранить свое значение, но не перезагружать его в 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
0 голосов
/ 23 марта 2012

Я не могу найти, почему состояние представления не сохранялось после обратной передачи, но я нашел другой способ хранения значения с помощью 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.

0 голосов
/ 21 марта 2012
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 

Введите этот код

0 голосов
/ 21 марта 2012

Когда происходит обратная передача (то есть, когда форма отправляется на сервер), значения переменных, заданные на странице code-behind, стираются из памяти клиентской системы

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

...