如何妥善处理ViewState错误?

时间:2020-03-05 18:56:14  来源:igfitidea点击:

我正在运行一些带有各种gridviews的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)

解决方案

回答

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

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

使用提供者模型设计模式检查ViewState Provider的实现,以提供自定义Viewstate提供者。

回答

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

回答

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

无论如何,我都感到很痛苦,调试这些错误从来都不是一件容易的事,除了研究ViewState的工作方式之外,我对如何找到问题没有简单的答案。

回答

上面的帖子为我们提供了解决问题的一些答案。如果我们只想在过渡期间处理丑陋的错误,那么自定义错误是正常处理所有"丑陋的黄色错误"的最简单方法

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

http://msdn.microsoft.com/zh-CN/library/h0hfz6fc.aspx

回答

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

如果我们想了解全局错误处理程序的一般实现方法,请在我的网站上找到,如果需要,我可以给我们代码http://iowacomputergurus.com/free-products/asp.net-global-error -handler.aspx