2012-03-21 64 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()方法和你的價值觀應該被堅持。