Viewstate と F5 ページの更新で ASP.NET アプリケーションに問題があります。
あるページから別のページに移動した後、すぐに F5 キーを押すと、次のエラーが発生します。
System.InvalidCastException
"Unable to cast object of type 'System.Web.UI.Triplet'
to type 'System.Web.UI.Pair'."
これにより、ページに次の例外が表示されます。
HttpException (0x80004005): 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.]
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +310
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Page.LoadAllState() +439
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1092
失敗するポイントは、親 LoadViewState を呼び出すときに、カスタム ラベル コントロールのオーバーライドされた LoadViewState メソッドにあります。
System.Web.UI.WebControls.Label.LoadViewState(ByVal savedState As Object)
savedState オブジェクトは、Label コントロールが期待する System.UI.Pair オブジェクトではなく、System.Web.UI.Triplet である完全に異なるコントロール (ドロップダウン リスト) 用のようです。
同じアプリケーションで別のページを使用してまったく同じことを行うと、F5 ポストバックの後にページが正常に読み込まれます。2 つの Web ページは同じ基本クラスから継承し、同じカスタム コントロールを使用します。問題の原因となっているページには、動的に追加されたコントロールがありません。
プロセスをデバッグしたところ、正常にロードされたページのコントロールに対する F5 ポストバックの後、LoadViewState イベントが発生していないようです。どちらの場合も SaveViewState が発生します。
LoadViewState イベントが 1 つのページで発生し、他のページでは発生しない理由はありますか? 私は ASP.NET にかなり慣れていないので、ViewState の仕組みについてまだ頭を悩ませています。