2

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 の仕組みについてまだ頭を悩ませています。

4

1 に答える 1

1

コードを見ずに多くを語ることは困難です。ただし、役立つ可能性のあるいくつかのこと:

  1. Fiddler などの Web デバッガーを使用して、障害発生時の HTTP 交換を確認することをお勧めします。答えが飛び出す可能性は十分にあります。
  2. F5 は最後の要求を再発行することに注意してください。あるページから別のページに移動している場合、クロスページ投稿を行っていない限り、ViewState はまったく存在しないはずです。
  3. ViewState がリクエストと共に送信されていない場合、おそらく失敗の性質は、それをエンコードする方法と関係がありますか?
  4. LoadViewState() は、関連するコントロールにロードする必要がある ViewState が着信要求に含まれている場合にのみ呼び出す必要があります。
  5. SaveViewState() は、すべてのページ リクエストに対して呼び出され、コントロールの状態をページの非表示フィールドに保持して、ポストバック中に使用できるようにします。
于 2009-12-01T14:07:04.423 に答える