1

ここに私のセットアップの基本があります:

System.Web.UI.Page から継承する BasePage クラスがあります。BasePage には 2 つのプロパティが実装されており、その get/set が ViewState コレクション内の 2 つの異なる項目から実行されるようになっています (例: BasePage の this.ViewState["Year"])。

BasePage から継承する別のクラスがあります。それを SpecificBasePage と呼びましょう。

最後に、SpecificBasePage を継承する aspx ページがあります。

ブレーク ポイントを追加し、コードを何度も実行したところ、最初のページ ロードで両方のビュー ステート プロパティに値が割り当てられ、最初のページ ロードのライフ サイクル全体で値が保持されることがわかりました。

ただし、ページがポストバックされると、Page_Load イベントおよびその他のイベント ハンドラー (ViewState をロードする必要がある場合) で、両方のプロパティが null を返します。this.ViewState.Count を調べると、コレクションにオブジェクトがないことがわかります。

ViewState に影響を与え、この動作を引き起こす可能性のあるどこかで私が行っていることを誰かが考えることができますか?

-- さらに、コードの一部に分離しました。初期ロード時に、OnInit でビューステート プロパティの値を指定します。これを OnLoad に移動すると、ポスト バック全体で値が保持されることがわかりました。追加されたビュー ステートの値は最初のページのライフサイクル全体で保持されますが、ポスト バックで破棄されますか?

4

4 に答える 4

4

ページの aspx で EnableViewState = false が設定されている可能性があります

また、アプリケーションの web.config で無効になっている場合や、要素上のコンピューター全体で無効になっている場合もあります。

更新 1: asp.net ライフサイクルでは、ViewState は Init の後、 Load more infoの前に読み込まれます。init に関するものはすべて、ページの宣言の一部と見なされます。後でasp.netがビューステートをロードし、その後、ビューステートへの変更の追跡を開始します。この後、asp.net はビューステートの初期情報と変更された情報との違いを確認するため、それをロードに移動すると問題が回避されます (初期状態は存在せず、新しい状態はビューステートに置くものであるため)。 . 上記のリンクから:

「その理由は、StateBag クラスはその TrackViewState() メソッドが呼び出された後にのみメンバーへの変更を追跡するためです。つまり、StateBag がある場合、TrackViewState() が行われる前に行われたすべての追加または変更は追跡されません。 SaveViewState() メソッドが呼び出されたときに保存されます. TrackViewState() メソッドは、インスタンス化ステージの後に発生する初期化ステージの最後に呼び出されます. したがって、インスタンス化ステージでの最初のプロパティの割り当て—ビューステートに書き込まれている間TrackViewState() メソッドがまだ呼び出されていないため、プロパティの set アクセサーは、ビュー ステートの保存段階での SaveViewState() メソッドの呼び出し中に永続化されません。」

于 2009-03-09T17:01:28.727 に答える
0

後で追加した部分で述べたように、ページの読み込み前にビューステートに何も設定できないようですが、Asp.net はエラーをスローせず、最初のページのライフサイクル全体でビューステートに存在します。 、その後のポストバックのライフサイクルでは持続しません。

于 2009-03-09T18:27:16.243 に答える