エラーの詳細を以下に示します。このエラーはたまに/めったに/たまにしか発生せず、それを再現する手順はありません。
どのコントロールがこのビューステートエラーをスローしているのかを知るにはどうすればよいですか?
エラーメッセージ:ビューステートのロードに失敗しました。ビューステートがロードされるコントロールツリーは、前のリクエスト中にビューステートを保存するために使用されたコントロールツリーと一致する必要があります。たとえば、コントロールを動的に追加する場合、ポストバック中に追加されるコントロールは、最初のリクエスト中に追加されたコントロールのタイプと位置と一致する必要があります。
いつ:めったに/たまに
再作成の手順:できません
スタックトレース:
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Web.HttpException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
at System.Web.UI.Page.LoadAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
--- End of inner exception stack trace ---
at System.Web.UI.Page.HandleError(Exception e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest()
at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
at System.Web.UI.Page.ProcessRequest(HttpContext context)
at ASP.sessions_aspx.ProcessRequest(HttpContext context) in c:\windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\73694782\85423fe4\App_Web_mnrmfsfa.8.cs:line 0
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
残念ながら、コントロール階層に正しく追加されていない有罪のコントロールがどれであるかを正確に確認する方法はありません。
有る!
デバッグ設定で「Justmycode」を無効にします。そして、スローされたすべての例外をキャッチします(Ctrl-Alt-Eで開いたダイアログで共通言語ランタイムの「スロー」をチェックします)。
例外が発生した後、Controlオブジェクトが使用可能な最も近いスタックフレームに移動し、そのClientIDと親を調べます。
より一般的には、このエラーは、フレームワークがビューステートをロードできないようにページの制御階層が変更されるの場合に発生します。ビューステートメカニズムは、コントロール階層がロード時に保存されたときと同じであると想定しています。
この可能性がありますページのコントロールを変更してもビューステートの読み込みが妨げられない場合があるため、ランダムエラーのように見えます。ページを見て、動的に作成/削除されるコントロールを探します。コントロールがページに追加されていることを確認しますbeforeビューステートがロードされます(ページのLoadイベントの前になります)。
残念ながら、コントロール階層に正しく追加されていない有罪のコントロールがどれであるかを正確に確認する方法はありません。このエラーを確認する一般的な方法は、イベントにいくつかの動的コントロールを追加することです(たとえば、ドロップダウンで選択したインデックスが変更された場合)-この方法で状態がビューの状態に保存されますが、ポストバックで再度追加することはありません-このようにビュービューステートがロードされるとコントロールが存在しなくなるため、ステートは無効です。
このエラーには回避策があります。
動的にロードするすべてのコントロールのEnableViewstateプロパティをfalseに設定します。これは完全な解決策ではありません。このエラーを回避するために、ここでコントロールのViewStateを無効にしています。
この解決策は、他のエラーによって頭を上げる可能性があるため、この修正を適用するときは注意してください。
このエラーが発生しました。クロスページのポストバックがある場合に発生します。
例:ビューAをロードします。ビューAが正常にロードされます。理由は何であれ、ビューAがロードされた条件は存在しません。フォールバックページはビューBです。したがって、ユーザーはビューAとポストバックのフォームに入力します。ビューAの条件が満たされないため、ビューAのフォーム値がビューBに転記されます。
これはおそらくあなたのためにそれをするはずです。
http://yakshaver.blogspot.com/2011/03/greatest-viewstate-attribute-to-ever.html
カスタムコントロールが誤ってPage_Load()で作成されたときに、このエラーが発生しました。コントロールはOnInit()で動的に作成する必要があります。
おそらくこれを再現するには、ページが完全に読み込まれる前にstoppingページを作成し、次にポストバックを送信します。サーバーがサーバーから完全なビューステートを取得できなかった場合、ポストバック時にサーバーはビューステートを再作成できないため、クラッシュします。
グリッドビューを使用しているときにこのエラーが発生しました。これは、ページのレンダリングが完全に完了する前に、ユーザーの操作によってポストバックが発生した場合に発生します。
ただし、VS2005SP1で修正されたと思います。
私はまったく同じ問題を経験しました。マスターページに2つの更新されたパネルに関連付けられた2つのリストビューがありました。
リストビューでEnableViewStateを無効にすると、問題が解決しました。