3

ここでイベントの順序を理解しようとしています。

このページは、ページのライフサイクルのある時点で、ViewStateがページセッションにマップされていることを示しています。

私はそれがコントロールで起こると仮定しています。SaveViewState()メソッド。

これがいつ起こるか誰かに教えてもらえますか?

Page_LoadでViewState変数を読み取るコードが表示されているので心配ですが、セッションがクリアされた後も情報が返されると思います。(設定したタイムアウトリダイレクトで問題が発生します)

4

2 に答える 2

3

ViewState はInit と Load 1の間で復元され、 PreRender のに保存されます。したがって、PreRender を介して Load で使用することは有効です。

しかしViewState != Session。ViewState は非表示フィールド2にあるため、セッションではなくページ フォームに関連付けられています。したがって、セッションタイムアウトが検出されたときに「クリア」されない限り、次のポストバックでクライアント側に保存された値 (数時間、または数日、古い場合があります;-) がポストされます。__VIEWSTATE


1実際には、PreLoad で ViewState にアクセスしても問題ありません。これは、ページでは使用できますが、一般的なコントロールでは使用できません。LoadViewState/TrackViewState は、デフォルトでページの初期化に実行されます。(そして、ページの初期化は、現在階層内にあるすべてのコントロールの初期化の後に行われます。)

2フォームを使用することが、ViewState を処理する唯一の正しい方法だと思います。ただし、別のバッキング (サーバー側など) を使用して保存/ロードすることができます。

于 2012-04-12T18:14:17.073 に答える
2

まず、ViewStateページ読み込みで を初期化します。以下に示すように、各ページのイベントにブレークポイントを設定します。

各イベントでのボタンクリックでデバッグを開始します。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        ViewState["abc"] = "10";
    }
}

protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
}

protected override void OnInitComplete(EventArgs e)
{
    base.OnInitComplete(e);
}

protected override void OnPreLoad(EventArgs e)
{
    base.OnPreLoad(e);
}

OnPreLoadViewState の永続化された値を提供し始めます。Init/InitComplete/PreInit のようなこのイベントの前に、ViewState の値は与えられません。

ポストバックが発生するSaveViewState()と、新しい値がキャプチャLoadViewState()され、ポストバック後に再入力されます。

Session と ViewState を比較するのはなぜですか?

于 2012-04-12T18:24:09.453 に答える