Understand of the ViewState

8249 ワード

みんなはすべてViewStateに対してすべてよく知らないことを信じて、ネット上でViewStateについての文章はすでに満天に舞って、しかし私はずっと真剣にこの東を扱ったことがなくて、最近やっとよく勉強する機会があって、毎日向上します.特にTruly-Understanding-Viewstateの記事の例を抽出します.

(一)次の3つの方法で3つの異なるページを作成し、ViewStateの生成をテストする必要があります。


Page1:
<form id="form1" runat="server">

<asp:label id="label1" runat="server" text="abc" />

<asp:button id="button1" runat="server" text="Postback" />

</form>




Page2:
<form id="form1" runat="server">

<asp:label id="label1" runat="server" text="We the people

                        of the United States,         in order to

                        form a more perfect union, establish justice, insure        

                        domestic tranquility, provide for the common defense, promote the        

                        general welfare, and secure the blessings of liberty to ourselves and        

                        our posterity, do ordain and establish this Constitution for the United        

                        States of America." />

<asp:button id="button1" runat="server" text="Postback" />

</form>




Page3:
<form id="form1" runat="server">

<asp:label id="label1" runat="server" text="abc" />

<asp:button id="button1" runat="server" text="Postback" />

</form>

 protected void Page_Load(object sender, EventArgs e)

        {

            label1.Text = @"We the people

of the United States, in order to form a more perfect union, establish justice,

insure domestic tranquility, provide for the common defense, promote the general

welfare, and secure the blessings of liberty to ourselves and our posterity, do

ordain and establish this Constitution for the United States of America.";

        }

問題は次のとおりです.
1最初のページでボタンをクリックしてリフレッシュした後、ViewStateは変わりましたか?
2 2ページ目ボタンをクリックしてリフレッシュした後、ViewStateは変わりましたか?ViewStateの長さは1と一致していますか?
3 3ページ目ボタンをクリックしてリフレッシュした後、ViewStateは変わりましたか?ViewStateの長さは1と一致していますか?
答えは簡単で、皆さんが不確実だと感じたら自分で実験すればいいです.
Page1:

Post Backの後、

Page2:

Post Back後

Page3:

Post Back後

(二)ViewStateはいつ生成されたのですか。コントロールの状態が変化してViewStateが生成されないのはどのような場合ですか?


まず、コントロールに関連するライフサイクルを見てみましょう.
OnInit
……
TrackViewState
OnLoad                     Page_Loadの中でViewStateの値を変更すると、IsDirty属性が自動的にtrueに設定されます.
OnPreRender
SaveViewStateここでViewStateをページに書き込みます
Render
……
トラックビューステートについて
MSDN曰く:
This method is called automatically at the end of the Init event in the server control's lifecycle.
StateBagがStateItemの変化を追跡し始めると、どの変化もStateItemのIsDirtyプロパティがtrueになります.
OnInitの前にIsDirtyプロパティはfalseであり、Valueプロパティの値をどのように設定してもIsDirtyプロパティは変更されません.OnInitの後、IsDirtyプロパティもfalseを保持し、Valueプロパティの値を初めて変更するまで(this.ViewState[key]の方法で変更されます).SaveViewStateの段階になると、IsDirty属性がtrueのStateItemのみが保存されます.
ここで重要なのは、ビューステータストラッキング機能を開くことに相当するTrackViewです.機能がオンになると、どんな変化も記録されます.この具体的にどのように変化を追跡するのか、どの大侠が研究したことがあるのか、教えてください.
もう一度振り返ってPage 3を見て..TrackView StateとSaveView Stateの間には、その誰が汚れているのか、自然とView Stateが生成されクライアントに出力されます.
全文に不適切な点があれば、ご指摘ください.