2008-09-16 102 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