2

我正在运行一些带有各种网格视图的 c# .net 页面。如果我将它们中的任何一个单独留在网络浏览器中很长一段时间(通常是一夜之间),当我单击页面上的任何元素时,我会收到以下错误。

我不确定从哪里开始处理这个问题。如果它的视图状态已过期,我不介意重置页面,但抛出错误是不可接受的!

  Error: The state information is invalid for this page and might be corrupted.

  Target: Void ThrowError(System.Exception, System.String, System.String, Boolean)

  Data: System.Collections.ListDictionaryInternal

  Inner: System.Web.UI.ViewStateException: Invalid viewstate. Client IP: 66.35.180.246 Port: 1799 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko/2008052906 Firefox/3.0 ViewState: (**Very long Gibberish Omitted!**)

  Offending URL: (**Omitted**)

  Source: System.Web

  Message: The state information is invalid for this page and might be corrupted.

  Stack trace: at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) at System.Web.UI.ClientScriptManager.EnsureEventValidationFieldLoaded() at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) at System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) at System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection) at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
4

5 回答 5

2

这很奇怪,因为 ViewState 在网页本身中存储为字符串。所以我看不出长时间会如何导致该错误。也许页面上的一个或多个对象已被垃圾回收或应用程序重置,因此视图状态正在引用旧控件,而不是在应用程序重新启动时创建的控件。

无论如何,我都感到你的痛苦,这些错误调试起来从来都不是一件愉快的事,除了可能研究ViewState 的工作原理之外,我没有简单的答案来解决如何找到问题

于 2008-09-16T15:18:07.023 回答
1

您可以通过将视图状态保存到数据库并仅在您需要的持续时间内进行清理来完全消除此错误。即使使用相对较小的视图状态,这也显着提高了页面的性能。

至少您可以从 Page 类继承并添加您自己的 ViewStateLoad 路由,以检查它是否已过期并重新加载默认状态。

检查ViewState Provider - 使用 Provider Model Design Pattern提供自定义 Viewstate 提供程序的实现。

于 2008-09-16T15:12:13.043 回答
0

或者,如果您知道超时长度,那么您可以在页面中添加一些 javascript,如果在预设时间段后页面上没有任何活动,则将用户重定向到替代页面。然后,您可以扩展它以警告客户他们的会话/页面即将到期,并为他们提供扩展它的方法(例如 javascript 服务器回调)。

于 2008-09-16T15:17:04.700 回答
0

以上帖子为您提供了解决问题的一些答案。如果只是在过渡期间处理丑陋的错误是您正在寻找的,自定义错误是优雅处理所有“丑陋的黄色错误”的最简单方法

http://msdn.microsoft.com/en-us/library/aa479319.aspx

http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx

于 2008-09-16T15:44:16.647 回答
0

另一种选择是添加一个全局错误处理程序,它将在应用程序级别捕获异常并将用户重定向到“会话已结束”页面。

如果您想了解全局错误处理程序的一般实现,我的网站上有一个可用的,如果需要,我可以给您代码 - http://iowacomputergurus.com/free-products/asp.net-global-错误处理程序.aspx

于 2008-09-16T21:35:03.527 回答