ASPを理解する.NET View State(2)

7396 ワード

ASPを理解する.NET View State(2)


手順3-再送データのロード
ページが再送された場合にのみ、再送データのロードフェーズが発生します.( : IsPostBack == trueサーバコントロールは、IPostBackDataHandlerインタフェースを実装することによって、返送されたデータをチェックしたいことを示すことができる.この段階では、Pageクラスはフォームドメインから再送データを列挙し、対応するサーバコントロールのために所望のデータを検索します.特定のコントロールが見つかった場合は、IPostBackDataHandlerインタフェースが実装されているかどうかを確認します.もしそうであれば、コントロールのLoadPostData()メソッドを呼び出して、適切な再送データをサーバコントロールに渡します.サーバコントロールは、再送されたデータに基づいてステータスを更新できます.
この過程を明確に説明するために、簡単な例を見てみましょう.ASP.NETの1つの利点は、1つのWebフォーム内のWebコントロールが返信中に値を記憶できることです.つまり、TextBoxコントロールを持っていて、ユーザーがTextBoxにいくつかのデータを入力し、データを返信すると、TextBoxのText属性がユーザーが入力した値に自動的に更新されます.これは、TextBoxがIPostBackDataHandlerインタフェースを実装し、Pageクラスが適切なデータをTextBoxクラスに渡し、Textプロパティが更新されるためです.
もっと具体的にするために、ASPがあると思います.ID属性がtxtNameのTextBoxに設定されているNET Webページ.ページに最初にアクセスすると、TextBoxは次のHTMLとして表示されます.ユーザーがこのTextBoxに値を入力すると(「Hello,World!」など)このフォームを提出すると、ブラウザは現在のASPを要求します.NET Webページは,フォームドメインの値をHTTP POSTヘッダに入れてサーバ側に伝達する.これらの値には、_VIEWSTATEなどの非表示ドメインと、txtName TextBoxからの値が含まれます.
ASP.NET Webページが返送されて返送データをロードする段階に入ると、Pageクラスは、ある返送のフォームドメインがIPostBackDataHandlerインタフェースに対応していることを検出する.アーキテクチャにこのようなコントロールが存在するため、TextBoxのLoadPostDataメソッドが呼び出され、ユーザーがテキストボックスの値を入力する(「Hello,World!」パラメータとしてこの方法に渡される.TextBoxのLoadPostDataメソッドは、渡された値をTextプロパティに簡単に割り当てるだけです.
なお、リターン・データのロードに関する議論では、ビュー・ステータスは言及されていません.ビューステータスに関する記事で、再送データのロードフェーズについて説明する理由を考えるかもしれません.なぜなら、この段階でビューステータスが関与していないことに注意したいからです.開発者の一般的な誤解は、エコー時にビューステータスがTextBox、ChexkBox、DropDownList、および他のウェブコントロールのためにそれらの値を記憶する責任を負うと考えられることである.これは事実ではない.なぜなら、これらの値は返信されたフォームドメインの値によって識別され、IPostBackDataHandlerインタフェースを実現したコントロールに対してLoadPostDataメソッドで付与されるからである.
ステージ4-マウント
この段階はすべてのASPに対してNET開発者は、ページのLoadイベントにイベントプロセッサ(Page_Load)を作成するので、よく知っています.Loadイベントがトリガーされると、ビュー状態は既にマウントされ(フェーズ2では、マウントビュー状態)、再送データも同様である(フェーズ3では、再送データがマウントされる).ページが返信された場合、Loadイベントがトリガーされたときに、ページが最後にページにアクセスしたときの状態に復元されたことを知っています.
フェーズ5-(Raise)エコーイベント
(注:Raiseとfireの違いに注意してください.fireを使用すると、一般的にイベントが発生し、私たちがこのイベントを処理していることを指します.raiseの意味は、私たちが現在していることに偏っていて、ある方法が呼び出されます.)
一部のサーバコントロールは、返信時に発生する変化Raiseイベントに基づいて使用できます.たとえばDropDownListコントロールにはSelectedIndex Changedイベントがあり、そのSelectedIndex値が前回のページマウント時の値と異なる場合、このイベントがトリガーされます.もう1つの例では、ウェブフォームがButtonコントロールをクリックして返信された場合、この段階でClickイベントがトリガーされます.
2つのタイプの返信イベントがあります.1つ目はChangedイベントです.再送時にデータが変更されると、このイベントがトリガーされます.一例はDropDownListコントロールのSelectedIndex Changedイベント、またはTextBoxのTextChangedイベントである.Changedイベントを提供するコントロールは、IPostBackDataHandlerインタフェースを実装する必要があります.もう1つのエコーイベントはraisedイベントです.これらのイベントは、サーバコントロールによって適切な方法でraisedされます.たとえば、Buttonコントロールはクリックするとraise Clickイベントが発生し、Calendarコントロールはユーザーが別の月に移動するとraises VisibleMonthChangedイベントが発生します.それらのraiseイベントのコントロールは、IpostBackEventHandlerインタフェースを実装する必要があります.
このフェーズでは、イベントがraisedされる必要があるかどうかを判断するために、返信データがチェックされるため、ページが返信された場合にのみこのフェーズが発生します.再送データのロードフェーズと同様に、raise再送イベントフェーズではビューステータス情報は使用されません.あるイベントがraisedに依存するかどうかは、再送されたデータに依存する.
フェーズ6-ビューステータスの保存
この段階では、ページクラスがページのビューステータスを構築します.すなわち、再送時に永続的なステータスが必要です.ページは、コントロールアーキテクチャ内の各コントロールのSaveViewState()メソッドを再帰的に呼び出すことによって、このタスクを完了します.合計ステータスはbase−64符号化文字列にシーケンス化される.フェーズ7では、ページが提示されると、ビューステータスは非表示ドメインとして永続的に存在する.
フェーズ7-レンダリング(Renderer)
提示段階でHTMLはクライアントに送信される.Pageクラスは、各コントロールのRenderControlメソッドを再帰的に呼び出すことによって、このタスクを完了します.
この7つのフェーズはビューの状態を理解するのに非常に重要です(PrenderフェーズやUnloadフェーズなどのフェーズをわざと省略していることに注意してください).この文章を読み続けるときは、ASPを要求するたびに覚えておいてください.NET Webページでは、この一連の段階を経験します.

ビューステータスの役割


ビューステータスの目的は非常に簡単です.コールバック時にステータスを維持します.(ASP.NET Webページのステータスは、そのコントロールアーキテクチャを構成するすべてのコントロールのプロパティ値です.)問題は「どのような状態が維持される必要がありますか?」この質問に答えるために、まず、どのような状態が返信時に維持される必要がないかを見てみましょう.初期化フェーズでは、コントロールアーキテクチャが作成され、宣言構文で指定された属性も付与されます.これらの宣言されたプロパティは、コールバックのたびに自動的に再割り当てされるため、ビューステータスにこれらのプロパティ値を格納する必要はありません.
たとえば、次のように宣言されるLabelコントロールがあります.
asp:Label runat="server"Font-Name="Verdana"
  Text="Hello, World!">
コントロールアーキテクチャが初期化段階で構築されると、LabelのTextは「Hello,world!」に設定されます.Font属性のName属性はVerdanaに設定されます.これらのプロパティは、ページアクセスのたびに初期化フェーズで設定されるため、ビューステータスで維持する必要はありません.
ビューステータスに格納する必要がある情報は、プログラムによって変更されるページステータスです.たとえば、このLabelコントロールに加えて、ページには2つのButtonコントロール、1つのChange Messageボタン、1つのEmpty Postbackボタンが含まれているとします.Change MessageボタンにはClickイベントプロセッサがあり、LabelのTextプロパティを「Goodbye,Everyone!」に設定します.Empty Postbackボタンの役割は、1回のコールバックを引き起こすだけで、コードは実行されません.LabelのText属性の変更はビュー状態に保存する必要があります.この変更がどのように行われたのか、いつ行われたのかを見極めるために、一例をすばやく見てみましょう.ページのHTMLセクションには、次のタグが含まれているとします.
  Font-Name="Verdana" Text="Hello, World!">

  Text="Change Message" ID="btnSubmit">

并且code-behind类包含下面的针对ButtonClick事件的事件处理器:

private void btnSubmit_Click(object sender, EventArgs e)
{
  lblMessage.Text = "Goodbye, Everyone!";
}

図4は、イベント発生の順序を説明し、LabelのText属性の変更がビュー状態に格納される必要がある理由を明確に説明する.
図4.イベントとビューのステータス
Labelが変化したTextをビュー状態に保存することが重要である理由を理解するためには,この情報がビュー状態に保存されていなければ何が起こるかを考える.すなわち、ステップ2でのビュー状態の保存段階において、ビュー状態情報を永続化しなければ、ステップ3のLabelのText属性は初期化段階で「Hello,World!」として付与され、マウントビューの状態段階で「Goodbye,Everyone!」と再割り当てされるのではなく、したがって,端末ユーザの観点からLabelのText属性はフェーズ2で「Goodbye,Everyone!」となり,ただし、フェーズ3でユーザがEmpty Postbackボタンをクリックすると、Textプロパティはその初期値(「Hello,World!」)にこっそり再設定されます.(注:ユーザーがEmpty Postbackボタンをクリックした後、Webページは変更されずにユーザーの直感に合致します.Empty PostbackボタンはChange Messageボタンとは異なり、何もしていないからです.)
未完待続...