15

错误的详细信息如下。此错误仅偶尔/很少/有时发生,并且没有任何步骤可以重现它。

我怎么知道哪个控件抛出了这个 Viewstate 错误?

错误消息:无法加载视图状态。正在加载视图状态的控制树必须与在先前请求期间用于保存视图状态的控制树匹配。例如,当动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。

时间:很少/偶尔

重建步骤:不能

堆栈跟踪:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Web.HttpException: 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.
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Page.LoadAllState()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   --- End of inner exception stack trace ---
   at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.sessions_aspx.ProcessRequest(HttpContext context) in c:\windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\73694782\85423fe4\App_Web_mnrmfsfa.8.cs:line 0
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
4

9 回答 9

24

不幸的是,没有办法查看究竟是哪个有罪控制没有正确添加到控制层次结构中。

有!

在调试设置中禁用“只是我的代码”。并捕获所有抛出的异常(在 Ctrl-Alt-E 打开的对话框中检查公共语言运行时的“抛出”)。

发生异常后,转到 Control 对象可用的最近的堆栈帧并检查其 ClientID 和父级。

于 2009-02-24T07:55:58.133 回答
13

更一般地,当页面的控制层次结构以阻止框架加载视图状态的方式发生更改时,会发生此错误。视图状态机制假定控件层次结构在加载时与保存时相同。

可能看起来像一个随机错误,因为在某些情况下更改页面中的控件不会阻止加载视图状态。查看您的页面并查找动态创建/删除的控件。确保在加载视图状态之前(即在页面加载事件之前)将任何控件添加到页面。

不幸的是,没有办法查看究竟是哪个有罪控制没有正确添加到控制层次结构中。查看此错误的常见方法是在事件上添加一些动态控件(例如,在更改的下拉选定索引上) - 这样它们的状态将保存到视图状态 - 但不会在回发时再次添加它们 - 这样视图state 无效,因为加载视图状态时控件不再存在。

于 2009-02-24T07:43:50.377 回答
5

此错误有一个解决方法:

将所有动态加载控件的 EnableViewstate 属性设置为 false。这不是一个完整的解决方案;我们在此处禁用控件的 ViewState 以绕过此错误。

此解决方案可能会引起其他错误,因此在应用此修复程序时要小心。

于 2010-02-10T09:38:58.823 回答
4

我遇到过这个错误,它发生在跨页面回发时。

例如:您加载视图 A。视图 A 加载正常,无论出于何种原因,加载视图 A 的条件不再存在。后备页面是视图 B。因此用户在视图 A 上完成表单并回发。由于不再满足视图 A 的条件,视图 A 的表单值将发布到视图 B。

于 2009-02-24T06:50:19.553 回答
2

当我的自定义控件在 Page_Load() 中意外创建时,我遇到了这个错误。控件应该在 OnInit() 中动态创建。

于 2010-08-23T20:41:38.407 回答
2

这可能应该为你做。

http://yakshaver.blogspot.com/2011/03/greatest-viewstate-attribute-to-ever.html

于 2011-03-27T14:11:24.147 回答
0

我遇到了完全相同的问题。我在母版页中有 2 个列表视图,与 2 个更新面板相关联。

禁用 Listviews 上的 EnableViewState 为我解决了这个问题!

于 2011-02-07T10:57:54.857 回答
0

我在使用 gridview 时看到了这个错误。当页面完全渲染完成之前用户交互导致回发时,就会发生这种情况。

不过,我相信它已在 VS2005 SP1 中修复。

于 2009-02-24T19:25:17.507 回答
0

您可以通过在页面完全加载之前停止页面然后提交回发来重现此情况。如果服务器无法从服务器获取完整的视图状态,那么它将无法在回发时重新创建它,从而导致崩溃。

于 2009-08-13T04:32:46.970 回答