2

我的 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 的工作原理有所了解。

4

1 回答 1

1

没有看到你的代码很难说太多。但是,一些可能会有所帮助的事情:

  1. 您可能想使用 Fiddler 等 Web 调试器查看失败期间的 HTTP 交换;答案很有可能会突然出现在你身上。
  2. 请记住,F5 重新发出最后一个请求。如果您从一个页面导航到另一个页面,则根本不应该有任何 ViewState,除非您正在执行跨页面发布。
  3. 如果 ViewState 没有随请求一起发送,那么故障的性质可能与您对其进行编码的方式有关?
  4. 只有当传入的请求包含需要加载到关联控件中的 ViewState 时,才应调用 LoadViewState()。
  5. 每个页面请求都会调用 SaveViewState(),以将控件的状态保存在页面上的隐藏字段中,以便在回发期间可用。
于 2009-12-01T14:07:04.423 回答