ASP.NET ページのライフ サイクルの概要

更新 : 2007 年 11 月

ASP.NET ページが実行されると、ページは一連の処理を実行するライフ サイクルを通過します。これには、初期化、コントロールのインスタンス化、状態の復元と維持、イベント ハンドラ コードの実行、およびレンダリングが含まれます。ライフ サイクルの適切な段階にコードを記述して意図する結果を得るためには、ページのライフ サイクルを理解することが重要です。さらに、カスタム コントロールを開発する場合は、コントロールを正しく初期化し、コントロールのプロパティにビューステート データを入力し、コントロールの動作コードを実行するために、ページのライフ サイクルに慣れておく必要があります。コントロールのライフ サイクルはページのライフ サイクルに基づきますが、ページはコントロールに対して ASP.NET ページのみで利用できるイベントより多くのイベントを発生します。

ページのライフ サイクルの一般的な段階

一般に、ページは次の表に記載されている段階を通過します。ページのライフ サイクルの段階に加えて、要求の前後に発生し、特定のページに固定されないアプリケーションの段階があります。詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

段階

説明

ページの要求

ページのライフ サイクルが始まる前にページの要求が発生します。ユーザーがページを要求すると、ASP.NET はページが解析とコンパイルを必要とするか (ページのライフ サイクルが開始される)、またはページを実行せずにキャッシュされたバージョンを送信できるかを判定します。

開始

開始の段階では、Request プロパティ、Response プロパティなどのページのプロパティが設定されます。この段階で、ページは要求がポストバックであるか、新しい要求であるかを判定し、IsPostBack プロパティも設定します。さらに、開始の段階ではページの UICulture プロパティが設定されます。

ページの初期化

ページの初期化中にはページのコントロールが使用でき、各コントロールの UniqueID プロパティが設定されます。テーマがある場合は、それもページに適用されます。要求がポストバックの場合、ポストバック データはまだ読み込まれていません。また、コントロール プロパティの値もビューステートから復元されていません。

読み込み

読み込み中には、要求がポストバックの場合は、ビューステートとコントロールの状態から取得された情報によって、コントロールのプロパティが読み込まれます。

検証

検証中には、すべての検証コントロールの Validate メソッドが呼び出され、個々の検証コントロールとページの IsValid プロパティが設定されます。

ポストバック イベントの処理

要求がポストバックの場合、すべてのイベント ハンドラが呼び出されます。

レンダリング

レンダリング前に、そのページとすべてのコントロールのビューステートが保存されます。レンダリング フェーズでは、ページからコントロールごとに Render メソッドが呼び出されます。このメソッドには、ページの Response プロパティの OutputStream に出力を書き出すテキスト ライタを指定します。

アンロード

ページのレンダリングが完了し、クライアントに送信され、破棄する準備ができるとアンロードが呼び出されます。この時点で、Response プロパティ、Request プロパティなどのページ プロパティはアンロードされ、後処理が実行されます。

ライフ サイクルのイベント

ページはライフ サイクルの各段階でイベントを発生するため、それを処理して各自のコードを実行できます。コントロール イベントでは、onclick などの属性を使用して宣言するか、コードを使用してイベント ハンドラをイベントにバインドします。

ページは自動イベント ワイヤアップもサポートするため、ASP.NET は特定の名前のメソッドを探し、特定のイベントが発生した場合に自動的にそのメソッドを実行できます。@ Page ディレクティブの AutoEventWireup 属性を true に設定すると (この属性が定義されていれば、既定値は true)、Page_Load イベント、Page_Init イベントなどのページ イベントは Page_event の名前付け規則を使用するメソッドに自動的にバインドされます。自動イベント ワイヤアップの詳細については、「ASP.NET Web サーバー コントロールのイベント モデル」を参照してください。

次の表に、ページのライフ サイクルで頻繁に使用するイベントを示します。その他にも多数のイベントがありますが、ほとんどのページ処理シナリオでは使用されません。その代わり、主に、ASP.NET Web ページ上のサーバー コントロールが自分自身を初期化して表示するときに使用されます。独自の ASP.NET サーバー コントロールを記述する場合は、これらの段階の詳細についても理解する必要があります。カスタム コントロールの作成方法については、「ASP.NET カスタム サーバー コントロールの開発」を参照してください。

ページ イベント

一般的な用途

PreInit

このイベントは次の場合に使用します。

  • IsPostBack プロパティを確認して、ページが今回初めて処理されるのかどうかを判断します。

  • ダイナミック コントロールを作成または再作成します。

  • マスタ ページを動的に設定します。

  • Theme プロパティを動的に設定します。

  • プロファイルのプロパティ値を読み取るか、設定します。

    ms178472.alert_note(ja-jp,VS.90).gifメモ :
    要求がポストバックの場合、コントロールの値はビューステートから復元されていません。この段階でコントロールのプロパティを設定すると、プロパティの値が次のイベントで上書きされる可能性があります。

Init

すべてのコントロールが初期化され、すべてのスキン設定が適用された後に発生します。このイベントは、コントロール プロパティの読み取りまたは初期化時に使用します。

InitComplete

Page オブジェクトで発生します。このイベントは、すべての初期化を完了する必要があるタスクを処理する場合に使用します。

PreLoad

このイベントは、Load イベントの前に、ページまたはコントロールに対して処理を実行する必要がある場合に使用します。

Page によってこのイベントが発生した後に、このページとすべてのコントロールのビューステートが読み込まれ、Request インスタンスに含まれるすべてのポストバック データが処理されます。

Load

PagePageOnLoad イベント メソッドを呼び出します。次に子コントロールについても個別に再帰的に同様の処理が実行され、子コントロールは、ページとすべてのコントロールが読み込まれるまで、その子コントロールについて同様の処理を実行します。

OnLoad イベント メソッドを使用し、コントロールのプロパティを設定し、データベース接続を確立します。

コントロールのイベント

これらのイベントは、特定のコントロール イベントを処理するときに使用します。たとえば、Button コントロールの Click イベント、または TextBox コントロールの TextChanged イベントなどです。

ms178472.alert_note(ja-jp,VS.90).gifメモ :
ポストバック要求で、ページに検証コントロールが含まれる場合は、処理を実行する前に、Page と個々の検証コントロールの IsValid プロパティをチェックします。

LoadComplete

このイベントは、ページ上にある他のすべてのコントロールが読み込まれる必要があるタスクに使用します。

PreRender

このイベントが発生する前に、次の処理が行われます。

  • Page オブジェクトは各コントロールとページについて EnsureChildControls を呼び出します。

  • DataSourceID プロパティが設定されている各データ バインド コントロールは、DataBind メソッドを呼び出します。詳細については、このトピックで後述する「データ バインド コントロールのデータ バインディング イベント」を参照してください。

PreRender イベントはページ上のコントロールごとに発生します。このイベントは、ページまたはコントロールのコンテンツに最終的な変更を加えるときに使用します。

SaveStateComplete

このイベントが発生する前に、ページとすべてのコントロールについて ViewState が保存されます。この時点で加えられたページまたはコントロールへの変更は無視されます。

このイベントは、ビューステートを保存する必要があっても、コントロールには変更を加えないタスクを実行するときに使用します。

Render

これはイベントではありません。処理のこの段階では、Page オブジェクトはこのメソッドをコントロールごとに呼び出します。すべての ASP.NET Web サーバー コントロールには、ブラウザに送信するコントロールのマークアップを書き出す Render メソッドがあります。

カスタム コントロールを作成する場合、一般に、このメソッドをオーバーライドしてコントロールのマークアップを出力します。ただし、カスタム コントロールで標準の ASP.NET Web サーバー コントロールのみを取り込んで、カスタム マークアップは取り込まない場合、Render メソッドをオーバーライドする必要はありません。詳細については、「ASP.NET カスタム サーバー コントロールの開発」を参照してください。

ユーザー コントロール (.ascx ファイル) は自動的にレンダリングを取り込むため、明示的にコード内でコントロールをレンダリングする必要はありません。

Unload

このイベントは、各コントロールで発生してから、ページで発生します。コントロールの場合、このイベントは、特定のコントロールに対して最終的な後処理を実行するときに使用します。たとえば、コントロール固有のデータベース接続を閉じるときなどです。

ページの場合、このイベントは、最終的な後処理作業を実行するときに使用します。たとえば、開いているファイルやデータベース接続を閉じるときや、ログ記録など要求固有のタスクを完了するときなどです。

ms178472.alert_note(ja-jp,VS.90).gifメモ :
アンロードの段階でページおよびそのコントロールがレンダリングされるため、応答ストリームをさらに変更することはできません。Response.Write などのメソッドを呼び出すと、ページから例外がスローされます。

ページのライフ サイクルに関するその他の考慮事項

個々の ASP.NET サーバー コントロールには、ページのライフ サイクルと同様のライフ サイクルがあります。たとえば、対応するページのイベントの間にコントロールの Init イベントと Load イベントが発生します。

InitLoad はどちらもコントロールごとに再帰的に発生しますが、発生は逆順です。Init イベント (および Unload イベント) は、対応するイベントがコンテナで発生する前に、子コントロールごとに発生します (ボトムアップ)。一方、コンテナの Load イベントは、子コントロール Load イベントの前に発生します (トップダウン)。

Button コントロールの ClickListBox コントロールの SelectedIndexChanged など、コントロールのイベントを処理することで、コントロールの外観や内容をカスタマイズできます。コントロールの DataBinding イベントまたは DataBound イベントを処理する場合もあります。詳細については、各コントロールのクラス リファレンス トピックおよび「ASP.NET カスタム サーバー コントロールの開発」を参照してください。

Page クラスからクラスを継承するときに、ページによって発生するイベントの処理に加えて、ページの基本クラスのメソッドをオーバーライドすることもできます。たとえば、ページの InitializeCulture メソッドをオーバーライドしてカルチャ情報を動的に設定できます。Page_event の構文を使用してイベント ハンドラを作成すると、基本の実装が暗黙的に呼び出されるため、メソッドでそれを呼び出す必要はありません。たとえば、Page_Load メソッドを作成するかどうかに関係なく、ページの基本クラスの OnLoad メソッドは常に呼び出されます。ただし、override キーワード (Visual Basic では Overrides) を使用してページの OnLoad メソッドをオーバーライドした場合は、明示的に基本メソッドを呼び出す必要があります。たとえば、ページの OnLoad メソッドをオーバーライドした場合は、基本の実装を実行するために、base.Load (Visual Basic では MyBase.Load) を呼び出す必要があります。

追加されたコントロールのイベントの遅れの取り戻し

コントロールが実行時に動的に作成される場合、またはデータ バインド コントロールのテンプレート内で宣言によって作成される場合、コントロールのイベントは、初期状態でページの他のコントロールとは同期していません。たとえば、実行時に追加されたコントロールの場合、Init イベントと Load イベントは、宣言によって作成されたコントロールの同じイベントよりも、ページのライフ サイクル内で遅れて発生します。そのため、インスタンス化された時点から、動的に追加されたコントロールとテンプレートのコントロールでは、Controls コレクションに追加されたイベントに追いつくまで、1 つずつイベントが発生します。

一般に、データ バインド コントロールを入れ子にしていない場合、この問題を考慮する必要はありません。子コントロールのデータがバインドされていても、コンテナ コントロールのデータがバインドされていない場合、子コントロールのデータとコンテナ コントロールのデータは同期しない可能性があります。このような状況は、コンテナ コントロールのデータ バインド値に基づいて子コントロールのデータ処理を実行するときに、特に起こります。

たとえば、各行に会社の記録を表示する GridView と、ListBox コントロールに会社の役職者一覧があるとします。役職者一覧に値を設定するために、ListBox コントロールを、クエリに CompanyID を使用して会社の役職者データを取得するデータ ソース コントロール (たとえば SqlDataSource) にバインドします。

ListBox コントロールのデータ バインド プロパティ (DataSourceIDDataMember など) が宣言によって設定されている場合、ListBox コントロールは、含まれる行の DataBinding イベント時に、データ ソースのバインドを試行します。ただし、GridView コントロールの RowDataBound イベントが発生するまで、行の CompanyID フィールドに値は指定されません。この場合、子コントロール (ListBox コントロール) は、それを含むコントロール (GridView コントロール) がバインドされる前にバインドされます。そのため、データ バインドの段階は同期しません。

この状態を回避するため、ListBox コントロールのデータ ソース コントロールを ListBox コントロールと同じテンプレート項目に配置します。また、ListBox のデータ バインディング プロパティを宣言によって設定しないようにします。その代わりに、実行時、RowDataBound イベントの間にプログラムで設定し、CompanyID 情報が使用できるようになるまで、ListBox コントロールがデータにバインドされないようにします。

詳細については、「データ ソース コントロールによるデータへのバインド」を参照してください。

データ バインド コントロールのデータ バインディング イベント

ページのライフ サイクルとデータ バインディング イベントとの関係を理解しやすいように、GridView コントロール、DetailsView コントロール、FormView コントロールなど、データ バインド コントロールのデータ関連のイベントを次の表にまとめます。

コントロールのイベント

一般的な用途

DataBinding

このイベントは、データ バインド コントロールによって発生します。発生するのは、データ バインド コントロールを含むコントロール (またはPage オブジェクト) の PreRender イベントの前です。このイベントは、コントロールのデータへのバインディング開始を明らかにします。

このイベントは、必要に応じてデータベース接続を手動で開くときに使用します (データ ソース コントロールによってこの処理が不要になることがよくあります)。

RowCreated (GridView のみ) または ItemCreated (DataListDetailsViewSiteMapPathDataGridFormViewRepeater、および ListView の各コントロール)

このイベントは、データ バインディングに依存していないコンテンツを操作するときに使用します。たとえば、実行時に、GridView コントロールのヘッダー行またはフッター行にプログラムで書式を追加できます。

RowDataBound (GridView のみ) または ItemDataBound (DataListSiteMapPathDataGridRepeater、および ListView の各コントロール)

このイベントが発生すると、行または項目のデータが使用できるようになります。そのため、データの書式を設定したり、子データ ソース コントロールに FilterExpression プロパティを設定して行または項目内の関連データを表示したりすることができます。

DataBound

このイベントは、データ バインド コントロール内でデータ バインディング操作の終了を明らかにします。GridView コントロールでは、すべての行とすべての子コントロールについてデータ バインディングが完了します。

このイベントは、データ バインド コンテンツの書式を設定するとき、または現在のコントロールのコンテンツ値に依存する他のコントロールでデータ バインディングを開始するときに使用します (詳細については、このトピックで前述した「追加されたコントロールのイベントの遅れの取り戻し」を参照してください)。

ログイン コントロール イベント

Login コントロールは、Web.config ファイルの設定を使用し、メンバシップの認証を自動的に管理できます。ただし、使用しているアプリケーションでコントロールの機能をカスタマイズする必要がある場合、またはLogin コントロール イベントとページのライフ サイクルの関連を把握する場合、次の表に記載したイベントを使用できます。

コントロールのイベント

一般的な用途

LoggingIn

このイベントは、ページの LoadComplete イベントの発生後、ポストバック中に発生します。ログイン処理の開始を明らかにします。

このイベントは、認証処理の開始前に発生する必要があるタスクに使用します。

Authenticate

このイベントは、LoggingIn イベント後に発生します。

このイベントは、Login コントロールの既定の認証動作をオーバーライドまたは強化するときに使用します。

LoggedIn

このイベントは、ユーザー名とパスワードの認証後に発生します。

このイベントは、別のページにリダイレクトするとき、またはコントロールのテキストを動的に設定するときに使用します。エラーが発生した場合、または認証が失敗した場合、このイベントは発生しません。

LoginError

認証が成功しなかった場合、このイベントが発生します。

このイベントは、コントロールに問題を説明するテキストを設定するとき、またはユーザーを異なるページに誘導するときに使用します。

参照

概念

ASP.NET Web サーバー コントロールのイベント モデル

ASP.NET Web アプリケーションのページとアプリケーション コンテキスト

ASP.NET ビューステートの概要

データ ソース コントロールによるデータへのバインド

参照

ASP.NET Web ページにおけるユーザー入力の検証

ASP.NET ログイン コントロールの概要

その他の技術情報

ASP.NET カスタム サーバー コントロールの開発

ASP.NET ページの構文

ASP.NET Web ページのサーバー イベント処理