次の方法で共有


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

更新 : 2007 年 11 月

ASP.NET の重要な特徴は、クライアント アプリケーションと同様のイベント ベース モデルに基づいて Web ページをプログラミングできるという点です。簡単な例として、ASP.NET Web ページにボタンを追加し、そのボタンのクリック イベントに対応するイベント ハンドラを記述できます。これは、ダイナミック HTML でボタンの onclick イベントを処理することによりクライアント スクリプトのみと連携する Web ページで一般的ですが、ASP.NET は、このモデルをサーバーベースの処理にします。

ASP.NET サーバー コントロールによって発生するイベントの動作は、従来の HTML ページやクライアント ベースの Web アプリケーションにおけるイベントと多少異なります。この違いは、主に、イベントが発生する場所とイベントが処理される場所が異なっていることによって発生します。クライアント ベースのアプリケーションでは、イベントはクライアント上で発生して処理されます。ただし、ASP.NET Web ページでは、サーバー コントロールに関連付けられているイベントは、クライアント (ブラウザ) で発生しますが、Web サーバー上の ASP.NET ページによって処理されます。

クライアントで発生するイベントに対して、ASP.NET Web コントロールのイベント モデルでは、イベント情報をクライアントでキャプチャし、イベント メッセージを HTTP ポスト経由でサーバーに送信する必要があります。ページは、このポストを解釈して、発生したイベントを確認し、サーバー上のコードで適切なメソッドを呼び出してイベントを処理する必要があります。

ASP.NET は、イベントをキャプチャし、送信し、そして解釈するタスクを処理します。ASP.NET Web ページでイベント ハンドラを作成するときは、通常、イベント情報をキャプチャしてコードで利用可能にするしくみについて考える必要はありません。従来のクライアント フォームの場合と同じようにイベント ハンドラを作成できます。ただし、ASP.NET Web ページでのイベント処理には、注意が必要な点がいくつかあります。

サーバー コントロールとページのイベント セット

ほとんどの ASP.NET サーバー コントロール イベントは、サーバーにラウンド トリップして処理する必要があるため、ページのパフォーマンスに影響を及ぼす可能性があります。そのため、サーバー コントロールが提供するイベントのセットは限定されており、通常は、クリック型のイベントだけを提供します。サーバー コントロールには、変更イベントをサポートするものがあります。たとえば、CheckBox Web サーバー コントロールは、ユーザーがボックスをクリックしたときにサーバー コードに CheckedChanged イベントを発生させます。また、より抽象的なイベントをサポートするサーバー コントロールもあります。たとえば、Calendar Web サーバー コントロールは、クリック イベントのより抽象的なバージョンである SelectionChanged イベントを発生させます。

onmouseover イベントのように頻繁に発生する (ユーザーが知らないうちに発生する場合もある) イベントは、サーバー コントロールではサポートされません。ただし、ASP.NET サーバー コントロールは、後で「ASP.NET Web サーバー コントロールのイベント モデル」で説明するように、これらのイベントのクライアント側ハンドラを呼び出すことはできます。

コントロールとページ自体も、各処理ステップごとに Init、Load、PreRender などの有効期間イベントを発生します。これらの有効期間イベントをアプリケーションで利用できます。たとえば、ページの Load イベントで、コントロールの既定値を設定できます。

イベント引数

サーバーベースの ASP.NET ページ イベントとコントロール イベントは、イベント ハンドラ メソッドの標準の .NET Framework パターンに従います。すべてのイベントは 2 つの引数を渡します。1 つは、イベントを発生させたオブジェクトを表すオブジェクトであり、もう 1 つは、イベント固有の情報を含むイベント オブジェクトです。2 番目の引数は、通常は EventArgs 型ですが、コントロールによっては、そのコントロールに固有の型になります。たとえば、ImageButton Web サーバー コントロールの場合、2 番目の引数は ImageClickEventArgs 型であり、ユーザーがクリックした座標に関する情報を含みます。

y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

ページのイベント (ページの Load イベントなど) では、標準の 2 つの引数を使用できますが、これらの引数には値が渡されません。

サーバー コントロールにおけるポストバック イベントと非ポストバック イベント

サーバー コントロールでは、クリック イベントなどの特定のイベントが発生すると、すぐにページがサーバーにポストバックされます。TextBox コントロールなどの HTML サーバー コントロールや Web サーバー コントロールの変更イベントの場合は、すぐにポストが行われることはありません。これらのイベントは、次回ポストが行われるときに発生します。

y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

ブラウザによってサポートされている場合は、検証コントロールでクライアント スクリプトを使用することにより、サーバーへのラウンド トリップを行わずにユーザーの入力をチェックできます。詳細については、「ASP.NET Web ページにおけるユーザー入力の検証」を参照してください。

ページがポストバックされると、ページの初期化イベント (Page_Init および Page_Load) が発生し、コントロール イベントが処理されます。ページのイベント処理に関して詳しい知識を持っている場合以外は、変更イベントが特定の順序で発生することを前提としたアプリケーション ロジックは作成しないでください。詳細については、「ASP.NET ページのライフ サイクルの概要」を参照してください。

アプリケーションで有効な場合は、変更イベントによってページをポストするように指定できます。変更イベントをサポートする Web サーバー コントロールには、AutoPostBack プロパティがあります。このプロパティが true の場合は、コントロールの変更イベントが発生すると、クリック イベントを待たずに、ページがすぐにポストされます。たとえば、既定では、CheckBox コントロールの CheckedChanged イベントが発生しても、ページは送信されません。ただし、このコントロールの AutoPostBack プロパティに true を設定した場合は、ユーザーがチェック ボックスをクリックすると、すぐにページがサーバーに送信され、処理されます。

y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

AutoPostBack プロパティが正しく動作するには、ユーザーのブラウザの設定で、スクリプトを許可する必要があります。ほとんどの場合は、既定でスクリプトが許可されています。ただし、ユーザーによっては、セキュリティ上の理由からスクリプトを無効にしている場合があります。詳細については、「ASP.NET Web ページのクライアント スクリプト」を参照してください。

イベントの転送

RepeaterDataListGridViewFormViewDetailsView などの Web サーバー コントロールには、それ自体がイベントを発生させるボタン コントロールを含めることができます。たとえば、GridView コントロールの各行に、テンプレートによって動的に作成される 1 つ以上のボタンを含めることができます。

イベントを個別に発生させる各ボタンではなく、入れ子になったコントロールから発生したイベントがコンテナ コントロールに転送されます。コントロールからイベントを受け取ったコンテナは、ItemCommand という汎用イベントを発生させます。このイベントのパラメータにより、元のイベントを発生させた個別のコントロールを確認できます。この 1 つのイベントに応答することにより、それぞれの子コントロールに対して個別のイベント ハンドラを記述する必要がなくなります。

ItemCommand イベントには、2 つの標準イベント引数が含まれています。1 つはイベントの発生元を参照するオブジェクトであり、もう 1 つはイベント固有の情報を含むイベント オブジェクトです。

y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

GridViewDataList、およびその他のデータ コントロールは、転送イベントの特別なケースである EditCommand、DeleteCommand、UpdateCommand などの追加のイベントをサポートします。

ボタンでは、CommandArgument プロパティを使用して、ユーザー指定の文字列をイベント ハンドラに渡すことにより、イベントの発生元のボタンを識別できます。たとえば、DataList コントロールでは、ボタンが ItemCommand イベントを発生させます。各ボタンの CommandArgument プロパティには、それぞれ異なる値を設定できるため、たとえば、あるボタンには "ShowDetails" という値を設定し、別のボタンには "AddToShoppingCart" という値を設定することで、後でこれらの値をイベント ハンドラでキャプチャできます。

メソッドへのイベントの関連付け

イベントとは、"ボタンがクリックされました" のようなメッセージです。アプリケーションのコードで、このメッセージをメソッド呼び出しに変換する必要があります。イベント メッセージと特定のメソッド (イベント ハンドラ) の関連付けは、イベントのデリゲートを使用して行います。詳細については、「イベントとデリゲート」を参照してください。

ASP.NET Web ページでは、コントロールがページで宣言を使用して (マークアップで) 作成されている場合は、デリゲートを明示的にコーディングする必要はありません。イベントの関連付けは、関連付けるイベントの種類や使用しているプログラミング言語に応じて、さまざまな方法で行うことができます。詳細については、「方法 : ASP.NET Web ページのイベント ハンドラを作成する」を参照してください。

コントロール イベントの関連付け

ページで宣言されたコントロールの場合は、コントロールのマークアップに属性 (プロパティ) を設定して、イベントをメソッドに関連付けることができます。ASP.NET Button コントロールの Click イベントを ButtonClick という名前のメソッドに関連付ける方法を次のコード例に示します。

<asp:button id="SampleButton" runat="server" 
   text="Submit" onclick="ButtonClick" />

ページをコンパイルするときに、ASP.NET は、ButtonClick というメソッドを検索し、このメソッドに適切なシグネチャが割り当てられていることを確認します (Object 型と EventArgs 型の 2 つの引数を承認します)。これで、ASP.NET は自動的にイベントをメソッドに関連付けます。

Visual Basic では、次のコード例に示すように、イベント ハンドラの宣言で Handles キーワードを使用して、イベントをメソッドに関連付けることもできます。

Private Sub ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles SampleButton.Click

ページ イベントの関連付け

ASP.NET ページは、Init、 Load、 PreRender などの有効期間イベントを発生させます。既定では、Page_eventname という名前付け規則を使用してページ イベントをメソッドに関連付けることができます。たとえば、ページの Load イベントに対応するハンドラを作成する場合は、Page_Load という名前のメソッドを作成できます。コンパイル時に、ASP.NET は、この名前付け規則に基づいてメソッドを検索し、イベントとメソッドの関連付けを自動的に実行します。Page クラスによって公開されるイベントの場合には、Page_eventname という名前付け規則を使用できます。

y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

ページ イベント処理メソッドは、引数を必要としません。

必要に応じて、ハンドラを明示的に作成することもできます。メソッドの名前付け規則に基づくページ イベントの自動的な関連付けは、AutoEventWireup というプロパティによって制御されます。既定では、このプロパティには true が設定され、ASP.NET は、前記のように検索と関連付けを自動的に実行します。また、@ Page ディレクティブに AutoEventWireup=false 属性を追加して、このプロパティに false を設定することもできます。この場合、任意の名前でメソッドを作成し、作成したメソッドをページ イベントに明示的に関連付けることができます。Visual Basic では、次のコード例のように、Handles キーワードを使用できます。

Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load

AutoEventWireup 属性の短所は、ページ イベント ハンドラに明確でわかりやすい名前を付ける必要があるという点です。このため、イベント ハンドラに名前を付ける際の柔軟性が制限されます。

y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

ページ イベントの明示的な関連付けを使用する場合は、AutoEventWireup プロパティを false に設定にし、メソッドが誤って 2 回呼び出されないようにする必要があります。

ダイナミック コントロールでの明示的な関連付け

マークアップで宣言してコントロールを作成する場合は、onclick などの属性を使用して、または Visual Basic では、Handles キーワードを使用して、イベントをメソッドに関連付けることができます。コントロールを動的に (コードで) 作成する場合、これらの方法はいずれも使用できません。コンパイラは、コンパイル時にコントロールへの参照を持たないからです。

この場合は、イベントの明示的な関連付けを使用する必要があります。Visual Basic では、AddHandler ステートメントを使用して、動的に作成されたコントロールのイベントを既存のメソッドに関連付けることができます。C# では、デリゲートを作成し、それをコントロールのイベントに関連付けます。ButtonClick というメソッドをボタンのClick イベントに関連付ける方法を次のコード例に示します。

Dim b As New Button
b.Text = "Click"
AddHandler b.Click, AddressOf ButtonClick
Placeholder1.Controls.Add(b)
Button b = new Button;
b.Text = "Click";
b.Click += new System.EventHandler(ButtonClick);
Placeholder1.Controls.Add(b);

ASP.NET サーバー コントロールにおけるクライアント イベントとサーバー イベントへの応答

このトピックでは、発生したイベントをサーバー コードで処理する方法について説明してきました。コントロールによってブラウザに表示される要素も、クライアント スクリプトで処理できるクライアント側イベントを発生させることができます。クライアント スクリプトを使用すると、マウス イベントとキーボード イベントの処理機能を ASP.NET サーバー コントロールに追加できます。詳細については、「ASP.NET Web ページのクライアント スクリプト」および「方法 : ASP.NET Web サーバー コントロールにクライアント スクリプト イベントを追加する」を参照してください。

アプリケーション イベントとセッション イベント

ASP.NET では、ページ イベントとコントロール イベントに加え、アプリケーションの開始時や終了時、または個別のユーザー セッションの開始時や終了時に発生する次のような有効期間イベントを使用できます。

  • アプリケーション イベントは、アプリケーションに対するすべての要求に対して発生します。たとえば、アプリケーションで ASP.NET Web ページや XML Web サービスが要求されると、HttpApplication オブジェクトの BeginRequest イベント (Application_BeginRequest) が発生します。このイベントにより、アプリケーションへの各要求に対して使用されるリソースを初期化できます。このイベントと対をなすイベントである HttpApplication オブジェクトの EndRequest イベント (Application_EndRequest) は、要求に対して使用されたリソースを閉じるか、または破棄する機会を提供します。

  • セッション イベント (Start イベントと End イベント) はアプリケーション イベントと似ていますが、アプリケーション内の固有のセッションで発生します。セッションは、ユーザーがアプリケーションに対して最初にページを要求したときに開始し、アプリケーションがセッションを明示的に閉じるか、またはセッションがタイムアウトしたときに終了します。

    y3bwdsh3.alert_note(ja-jp,VS.90).gifメモ :

    Session_End イベントは、どのような場合にも発生しません。詳細については、「End」を参照してください。

この種類のイベントに対応するハンドラは Global.asax ファイルに作成できます。詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」および「Global.asax 構文」を参照してください。

参照

概念

ASP.NET の状態管理の概要

その他の技術情報

方法 : ASP.NET Web ページのイベント ハンドラを作成する

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