2012-03-21 99 views
0

我在坚持中在回发视图状态的控制(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 

但是在每次回发时,viewstate都是空的。

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

更新2:上下文:

  • ASPX页(Editor.aspx)将加载一个网络控制(ObjectsEditor.ascx)动态地
  • ObjectsEditor.ascx包含单个定制控制的(对象.vb)
  • Objects.vb将创建另一个自定义控件(ObjectsContainer.vb)并将其添加到它的控件中 ObjectsContainer需要保持视图状态。

我将EnableViewState =“true”设置为无处不在,但仍无结果。我真的需要在这里设置这些属性吗? (ViewStateMode和EnableViewState)如果不是,我应该在哪里处理这些以及这些属性之间的区别是什么?

非常感谢。

回答

0

我找不到为什么视图状态回发后没有坚持,但我发现另一种方式来保存使用了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。

1

该页面的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

好的。我将把load viewstate部分移动到onload上。我会在一分钟之内通知你。 – ThdK 2012-03-21 10:12:45

+0

我将+1链接到msdn :) – ThdK 2012-03-21 10:14:33

+0

它不适用于将加载视图状态移动到onload方法。你有另一个想法可以帮助我吗? – ThdK 2012-03-21 12:11:10

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 

编写代码

+0

? – ThdK 2012-03-21 10:59:36

+2

多数民众赞成可选和取决于你的逻辑 – 2012-03-21 11:00:40

+1

我已经完成了这一点,并将视图状态加载到控件的onload部分。但仍然是相同的结果。 Viewstate在回传后没有任何问题。 – ThdK 2012-03-21 11:58:10

1

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

ASP.NET有一个相当复杂的请求/响应生命周期。每个循环运行一组事件,如Init,Load等。根据this article,特别是this image,有一种方法称为TrackViewState(),该方法在Init事件之后但在InitComplete事件之前执行。这意味着对ViewState所做的任何更改都不会像OP所做的那样在Init事件中进行,并且不会被保留(跟踪)。

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

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

因此,要回答你的问题,在OnPreLoad()方法设置你的ViewState值或做正如其他人建议,做它在OnLoad()方法和你的价值观应该被坚持。