2009-12-01 67 views
2

我的ViewState和F5頁面刷新的ASP.NET應用程序出現問題。F5頁面刷新後LoadViewState出現問題 - 無法加載視圖狀態

如果從一個頁面導航到另一個我馬上打F5後,我收到以下錯誤:

System.InvalidCastException 
"Unable to cast object of type 'System.Web.UI.Triplet' 
to type 'System.Web.UI.Pair'." 

這導致頁面上顯示以下異常:

HttpException (0x80004005): Failed to load viewstate. The control tree 
into which viewstate is being loaded must match the control tree that 
was used to save viewstate during the previous request. 
For example, when adding controls dynamically, the controls added during a 
post-back must match the type and position of the controls added during 
the initial request.] 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +310 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Page.LoadAllState() +439 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1092 

點當它調用父LoadViewState時,它在失敗時是在自定義標籤控件的重載LoadViewState方法中

System.Web.UI.WebControls.Label.LoadViewState(ByVal savedState As Object) 

savedState對象似乎是一個完全不同的控件(下拉列表),它是一個System.Web.UI.Triplet,而不是Label控件所期望的System.UI.Pair對象。

如果我在同一個應用程序中使用不同的頁面完全相同的事情,則頁面在F5回發之後加載正常。這兩個網頁從相同的基類繼承,並使用相同的自定義控件。導致問題的頁面沒有任何動態添加的控件。

調試完該進程後,它看起來好像加載成功的頁面上的控件的F5回發後,LoadViewState事件未被觸發。在兩種情況下都會觸發SaveViewState。

任何想法爲什麼LoadViewState事件會被觸發爲一個頁面,而不是其他?我對ASP.NET相當陌生,而且我仍然瞭解ViewState的工作原理。

回答

1

很難說沒有看到您的代碼很多。然而,一些事情可能幫助:

  1. 你可能想看看使用Web調試諸如Fiddler故障期間,HTTP交流;答案很可能會跳出來。
  2. 請記住,F5重新發出最後一個請求。如果您正在從一個頁面導航到另一個頁面,則除非您正在進行跨頁面發佈,否則根本不應該有任何ViewState。
  3. 如果ViewState未與請求一起發送,那麼失敗的性質可能與您對它的編碼方式有關?
  4. LoadViewState()只應在傳入請求包含需要加載到相關控件的ViewState時調用。
  5. 爲每個頁面請求調用SaveViewState(),以便將控件的狀態保存在頁面上的隱藏字段中,以便在回發期間可用。