2008-09-16 91 views
1

我正在运行一些c#.net网页与各种gridviews。如果我长时间(通常在一夜之间)将其中的任何一个单独留在网络浏览器中,则当我单击页面上的任何元素时,会出现以下错误。如何优雅地处理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) 

回答

1

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

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

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

0

或者,如果你知道超时长,那么你可以一个JavaScript代码添加到该用户重定向到其他页面,如果已经有一个预设的时间段后一直在网页上没有任何活动的页面。然后,您可以扩展它以警告客户他们的会话/页面即将到期,并为他们提供扩展它的手段(例如,javascript服务器回调)。

2

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

无论什么情况下,我觉得你的痛苦,这些错误是从不愉快的调试,我有没有简单的答案,如何找到或许比学习how ViewState works

0

另一个选项是最简单的方法添加一个全局错误处理程序,它将捕获应用程序级别的异常并将用户重定向到“Session Elapsed”页面。

如果你想有一个普遍实施全球错误处理程序的想法,我有我的网站上有一个可用,如果需要的话我可以给你的代码 - http://iowacomputergurus.com/free-products/asp.net-global-error-handler.aspx

相关问题