如何优雅地处理ViewState错误?

时间:2008-09-16 15:09:26

标签: c# .net exception viewstate

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

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

  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)

5 个答案:

答案 0 :(得分:2)

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

无论如何,我都感受到了你的痛苦,这些错误从来都不会令人愉快地调试,除了研究how ViewState works

之外,我对如何找到问题没有简单的答案。

答案 1 :(得分:1)

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

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

检查ViewState Provider - an implementation using Provider Model Design Pattern是否提供自定义Viewstate提供程序。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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