我的 ASP.NET 应用程序中出现 Viewstate 和 F5 页面刷新问题。
如果从一个页面导航到另一个页面后我立即按 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 回发后加载正常。这两个网页继承自同一个基类并使用相同的自定义控件。导致问题的页面没有任何动态添加的控件。
调试过程后,看起来 LoadViewState 事件在成功加载页面上的控件的 F5 回发后没有被触发。在这两种情况下都会触发 SaveViewState。
有什么想法为什么会为一个页面触发 LoadViewState 事件而不是另一个页面?我对 ASP.NET 还很陌生,但我仍然对 ViewState 的工作原理有所了解。