.NET TIPS

[ASP.NET]自動的に呼び出されるイベント・ハンドラは?

デジタルアドバンテージ
2003/06/13

 Webアプリケーションであるにもかかわらず、ASP.NETでは、Windowsプログラミングなどで主流のイベント駆動型プログラミングが可能となっており、これが生産性を高める1つの要因となっている。

 イベント駆動型プログラミングでは、まず特定のイベントに対応したメソッドを、イベント・ハンドラとして登録していく。これにより、ページがロードされた、ボタンがクリックされたなどのイベントが発生するたびに、設定したイベント・ハンドラがシステムにより呼び出されることになる。

 例えばVisual Studio .NETで新しいプロジェクトとして「ASP.NET Webアプリケーション」を選択すると、次のようなイベント・ハンドラ登録のためのコードと、

this.Load += new System.EventHandler(this.Page_Load);

 次のようなイベント・ハンドラ本体であるPage_Loadメソッドが自動的に用意される。

private void Page_Load(object sender, System.EventArgs e)
{
  // ページを初期化するユーザー コードをここに挿入します。
}

 このPage_Loadメソッドは、ページがロードされるときに呼び出されるため、コメントにあるようにページの初期化処理を記述することができる。このように、イベント・ハンドラとなるメソッドを記述し、それをイベント(クラスのメンバとしてeventキーワードにより宣言される)に追加するというのが基本的なプログラム記述だ。

「イベントの自動接続」機能

 ところが、次のようなプログラムでもPage_Loadメソッドは正しく呼び出される(このプログラムはコードビハインドを使用しておらず、\inetpub\wwwrootディレクトリにコピーすれば、単体で実行することができる)。

<%@ Page language="c#" %>
<html>
  <head>
    <script runat="server">

      void Page_Load(object s, EventArgs e) {
        Response.Write("ページがロードされました。<br>");
      }

    </script>
  </head>

  <body>
    AutoEventWireup属性のテスト
  </body>
</html>
ページのロード時にメッセージを表示するC#のサンプル・プログラム(autoevent1.aspx)

 ブラウザでこれを開くと次のような画面になる。

上記サンプル・プログラムの実行結果

 イベント・ハンドラの明示的な登録を行っていないにもかかわらず、自動的にイベント・ハンドラが呼び出されるのは、「イベントの自動接続」機能によるものだ。この機能は、.aspxファイルに記述する「@ Pageディレクティブ」のAutoEventWireup属性によりオン/オフできる。デフォルトではこの機能はオンになっているため、次のようなメソッド名とシグネチャを持ったメソッドは自動的にページのLoadイベント・ハンドラとして登録される。

void Page_Load(object s, EventArgs e)

 このPage_Loadメソッド以外にも、自動接続されるイベント・ハンドラには次のようなものがある。それぞれの機能とシグネチャについてはリファレンス・マニュアルを参照していただきたい。

  • Page_Init
  • Page_DataBind
  • Page_PreRender
  • Page_Unload
  • Page_Error

 実際には次のメソッドも自動接続されるが、これらはマニュアルには記述されていない。

  • Page_AbortTransaction
  • OnTransactionAbort
  • Page_CommitTransaction
  • OnTransactionCommit

 Visual Studio .NETでは、イベント・ハンドラを登録するためのコードが記述されているため、当然ながら自動接続機能はオフになっている。この様子は.aspxファイルをHTML表示て確認することができる。そこでは、次の図のようにAutoEventWireup属性にfalseが設定されている。

Visual Studio .NETで自動生成された.aspxファイルの内容
「@ Pageディレクティブ」でAutoEventWireup属性がfalseに設定されている。

 ここでAutoEventWireup属性をtrueに設定したり、あるいは先に示したサンプル・プログラムでPage_Loadイベント・ハンドラの登録を行ったりしてはいけない。こうすると、ページのロード時にPage_Loadメソッドが2度呼ばれてしまう。End of Article

カテゴリ:Webフォーム 処理対象:イベント・ハンドラ
使用キーワード:AutoEventWireup属性
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールでページ表示するには?
[ASP.NET]ポストとポストバックの違いは?
[ASP.NET]DataGridコントロールでビューステートを使用せずにページ表示するには?
[ASP.NET]ページから生成されたソース・コードを見るには?
ASP.NETでボタンのクリック時に確認メッセージを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH