F5页面刷新后LoadViewState出现问题 - 无法加载viewstate

时间:2009-12-01 11:55:53

标签: asp.net failed-to-load-viewstate

我在使用Viewstate和F5页面刷新的ASP.NET应用程序中遇到问题。

如果在从一个页面导航到另一个页面后我立即点击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 个答案:

答案 0 :(得分:1)

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

  1. 您可能希望使用像Fiddler这样的Web调试器来查看失败期间的HTTP交换;很有可能答案会跳出来。
  2. 请记住,F5会重新发出最后一个请求。如果您从一个页面导航到另一个页面,则根本不应该有任何ViewState,除非您正在进行跨页面发布。
  3. 如果没有随请求一起发送ViewState,那么失败的性质可能与编码方式有关吗?
  4. 仅当传入请求包含需要加载到关联控件中的ViewState时,才应调用LoadViewState()。
  5. 为每个页面请求调用SaveViewState(),以将控件的状态保留在页面上的隐藏字段中,以便在回发期间可用。