我在控件(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:上下文:
我在任何地方设置EnableViewState =“true”,但仍然没有结果。我真的需要在这里设置这些属性。 (ViewStateMode和EnableViewState)如果没有,我应该在哪里处理这些属性和这些属性之间的区别?
非常感谢。
答案 0 :(得分:4)
我在这里看到了一些正确的答案,但我没有看到任何详细的解释,所以我想我会说:
ASP.NET具有相当复杂的请求/响应生命周期。每个周期都会运行一系列事件,例如Init
,Load
等。根据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)
当回发发生时(即表单提交给服务器时),代码隐藏页面中设置的变量值将从客户端系统的内存中删除
答案 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。