連載
» 2002年07月23日 00時00分 公開

連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― :第5回 ASP.NETページのフレームワーク(後編)― @Pageディレクティブの活用 ― (1/2)

ASP.NETページの先頭に記述する@Pageディレクティブでは、ページ生成に関する多様な属性を指定する。後編ではこれについて詳しく見る。

[田口景介,著]
連載 プログラミングASP.NET ― ASP.NETによるWebアプリケーション実践開発講座 ― 
Insider.NET

 

「連載 プログラミングASP.NET ― ASP.NETによるWebアプリケーション実践開発講座 ― 」のインデックス

連載目次

@Pageディレクティブ

 前回では、@Pageディレクティブに指定できる属性として、Language、Inherits、Srcを解説してきたが、このほかにもページ全体の動作をコントロールするための属性が多数定義されている。今回はこれら属性のうち、利用頻度の高いものをまとめて解説しておこう。@Pageディレクティブには次の表に示す属性が定義されているが、この中で比較的利用頻度が高いと思われる属性は、AutoEventWireup、EnalbeViewState、Traceである。

属性 デフォルト値 機能
AspCompat false trueに設定するとSTAスレッド上でページが実行され、STAスレッドでしか生成できないCOMオブジェクトが利用可能になる
AutoEventWireup true falseに設定すると、Page_LoadメソッドとPage_Initメソッドが呼び出されなくなる
Buffer true 出力ストリームのバッファリングを有効にするかどうか設定する。trueならばバッファリングが行われる
ClassName ソース・ファイル名を元に生成 暗黙的に定義されるPageクラスの名前。ページが要求されたときに動的に自動コンパイルされるページのクラス名を指定する
ClientTarget リクエストしたクライアント ユーザー・エージェントの自動検出を無効化し、ページ生成の対象となるユーザー・エージェントを特定する
CodePage なし(UTF-8) ページの生成に使われるコードページを指定する
CompilerOptions なし ページのコンパイル時に指定されるコンパイラ・オプション
ContentType text/html 生成されるページのMIMEタイプを指定する
Culture ja-JP ページのカルチャを指定する
Debug false trueを指定すると、デバッグシンボルを含めてコンパイルされる
Description なし ページを説明する文字列を指定する。プログラムには影響を与えない
EnableSessionState true セッション状態の管理。true、fasle、ReadOnlyのいずれを指定する
EnableViewState true ビュー・ステートを維持するかどうか指定する。falseを指定すると、ビュー・ステートが維持されなくなる
EnableViewStateMac false trueを指定すると、ビュー・ステートが改ざんされていないかチェックが行われる
ErrorPage なし エラーが発生したときにリダイレクトするURLを指定する
Explicit true VB.NETでコードを記述したとき、trueを指定するとOption Explicitが設定される。VB.NET以外の言語では無視される
Inherits なし コードビハインドを利用するとき、Pageクラスの派生クラスを指定する
Language VB.NET ページ内に記述されたコードの使用プログラミング言語を指定する
LCID 1041 ページの生成に使われるロケール識別子を指定する
ResponseEncoding UTF-8 レスポンスに使われるエンコードを指定する
Src なし コードビハインドを利用するとき、ページに対応するソース・ファイルを指定する
SmartNavigation false trueを指定すると、スマート・ナビゲーションが使われる
Strict false VB.NETでコードを記述したとき、trueを指定するとOption Strictが設定される。それ以外の言語では無視される
Trace false trueを設定するとトレースが有効になり、トレース情報がレスポンスに出力される
TraceMode SortByTime トレースが有効なとき、トレース・メッセージを表示する方法を指定する。SortByTimeを指定すれば処理順序で、SortByCategoryならばカテゴリでソートされる
Transaction Disable ページでトランザクションをサポートするか指定する。Disable、NotSupported、Supported、Required、RequiresNewのいずれかを指定できる
UICulture ja-JP ページで使用するUIカルチャを指定する
WarningLevel 1 コンパイル時に指定する警告レベルを0〜4の範囲で指定する
@Pageディレクティブの属性

■@PageディレクティブのAutoEventWireup属性

 これまでのサンプルでは、Page_Loadメソッドを定義しておけば、サーバ・コントロールの準備が整えられたあとで自動的に呼び出されるものとして扱ってきたが、この挙動は@PageディレクティブのAutoEventWireup属性の値に依存している。デフォルトではこの属性に「true」が設定されているが、これを「false」に変更するとPage_Loadメソッドが自動的に呼び出されることはなくなる。また、同種のメソッドにPage_Initがあるが、こちらの呼び出しも行われなくなる。

 次のリスト5.1では、Page_InitメソッドとPage_Loadメソッドを定義しているが、AutoEventWireup属性にfalseを指定しているため、これらメソッドは呼び出されず、結果としてページには何も表示されない。

<%@ PAGE LANGUAGE="C#" AutoEventWireup="false" %>
<html>
<script runat="server">
void Page_Init(object sender, EventArgs e) {
  l1.Text = "Page_Init";
}

void Page_Load(object sender, EventArgs e) {
  l2.Text = "Page_Load";
}
</script>
<body>
<asp:Label id="l1" runat="server" /><br>
<asp:Label id="l2" runat="server" />
</body>
</html>

リスト5.1 AutoEventWireup属性をfalseに設定したASP.NETページ

 AutoEventWireupをfalseに設定した上で、ページの初期化処理を行いたければ、LoadイベントやInitイベントに対して、明示的にイベント・ハンドラを登録する必要がある。そして、そのためにはコードビハインドを利用して、Pageクラスの派生クラスを明示的に定義しなければならない。AutoEventWireupをfalseに設定すると、ページが読み込まれる前に処理を行えるタイミングがなくなってしまうため、コードビハインドを利用しなければイベント・ハンドラを登録することすらできないからだ。

 Page_LoadメソッドとPage_Initメソッドが呼び出されるようにするには、Pageクラスの派生クラス(下のリスト5.2およびリスト5.3ではUnnamedPageクラス)でOnInitメソッドをオーバーライドし、ここでイベント・ハンドラの登録を行う。AutoEventWireupがtrueのときには、Page_Loadメソッドが定義されていればPage.Loadイベントに、Page_Initメソッドが定義されていればPage.Initイベントに、それぞれ暗黙的にイベント・ハンドラとして登録される仕組みになっているので、これと同じ処理を行うには、以下のコードを記述する。

Init += new System.EventHandler(Page_Init);
Load += new System.EventHandler(Page_Load);

 ここではイベント・ハンドラの名前を“Page_Init”と“Page_Load”で定義しているが、こうして明示的に登録するときには、メソッド名は任意で構わない。Page_InitとPage_Loadという名前は、AutoEventWireup="true"のとき、暗黙的に参照されるイベント・ハンドラの名前であるにすぎず、Pageクラスにこのような名前のメソッドが定義されているわけではない。

 ところで、InitイベントはPage.OnInitメソッドの内部で発行されているため、このメソッドをオーバーライドしてしまっては、Initイベントが発生しなくなってしまう。そこで、Initイベントを発生させるためには、オーバーライドしたメソッドの最後に、

base.OnInit(e);

を記述して、基本クラス、すなわちPageクラスのOnInitメソッドを呼び出すようにしておかなければならない。

<%@ PAGE LANGUAGE="C#" AutoEventWireup="false" Inherits="UnnamedPage" Src="hoge09.aspx.cs" %>
<html>
<body>
<asp:Label id="l1" runat="server" /><br>
<asp:Label id="l2" runat="server" />
</body>
</html>

リスト5.2 AutoEventWireup属性をfalseに設定したASP.NETページ(コードビハインドにより記述。コード部分はリスト5.3)

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

public class UnnamedPage : Page
{
  protected Label l1;
  protected Label l2;

  private void Page_Init(object sender, EventArgs e) {
    l1.Text = "Page_Load";
  }

  private void Page_Load(object sender, EventArgs e) {
    l2.Text = "Page_Load";
  }

  override protected void OnInit(EventArgs e) {
    Init += new System.EventHandler(Page_Init);
    Load += new System.EventHandler(Page_Load);

    base.OnInit(e);
  }
}

リスト5.3 AutoEventWireupをfalseに設定した場合のPage_InitメソッドとPage_Loadメソッドの記述例

  

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。