【问题标题】:How to gracefully deal with ViewState errors?如何优雅地处理 ViewState 错误?
【发布时间】:2008-09-16 15:09:25
【问题描述】:

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

【问题讨论】:

    标签: c# .net exception viewstate


    【解决方案1】:

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

    无论如何,我感到你的痛苦,这些错误调试起来从来都不是愉快的,除了学习how ViewState works之外我没有简单的答案来找到问题。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2020-03-19
              • 2021-05-26
              • 1970-01-01
              • 2019-11-12
              • 2018-11-10
              • 2021-03-11
              • 1970-01-01
              • 2015-05-15
              • 1970-01-01
              相关资源
              最近更新 更多