ViewState を使用する Asp.net BasePage プロパティがポストバック時にクリアされる

StackOverflow https://stackoverflow.com/questions/627049

質問

私のセットアップの基本は次のとおりです。

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

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

最後に、SpecificBasePage を継承する aspx ページができました。

ブレークポイントを追加し、コードをステップ実行したところ、最初のページ読み込み時に、両方のビューステートプロパティに値が割り当てられ、その値は最初のページ読み込みライフサイクル全体にわたって持続することがわかりました。

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

ViewStateに影響を与えてこの動作を引き起こす可能性のあることをどこかで考えている人はいますか?

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

役に立ちましたか?

解決

ページの aspx で EnableViewState = false になっている可能性があります。

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

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

「その理由は、StateBagクラスがTrackViewState()メソッドが呼び出された後、メンバーの変更のみを追跡するためです。つまり、StateBagを持っている場合、saveviewState()メソッドが呼び出された場合、trackViewState()が作成される前に作成されたすべての追加または変更は保存されません。TrackViewState()メソッドは、インスタンス化段階の後に発生する初期化段階の最後に呼び出されます。したがって、TrackViewState()メソッドがまだそうではないため、SaveViewState()メソッド呼び出し中にSaveViewState()メソッド呼び出し中に、SaveViewState()メソッド呼び出し中に持続することはありません。呼び出されました。」

他のヒント

これは、別のユーザーが ASP.NETページのライフサイクルは、ViewStateの問題を調べる価値があります。

また、" ViewStateを完全に理解する"

後で追加した部分で述べたように、明らかにページのロード前にビューステートに何も設定することはできません。Asp.netでもエラーは発生せず、最初から最後までビューステートに存在しますページのライフサイクル、それは後続のポストバックのライフサイクルでは持続しません。

ViewStateの値を設定している場所を見てください。 OnUnloadイベントを接続し、ViewStateオブジェクトを調べて、値が実際に設定されていることを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top