.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ディレクトリにコピーすれば、単体で実行することができる)。
|
|
ページのロード時にメッセージを表示する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度呼ばれてしまう。
カテゴリ:Webフォーム 処理対象:イベント・ハンドラ 使用キーワード:AutoEventWireup属性 |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|