第5回 ASP.NETページのフレームワーク(後編)― @Pageディレクティブの活用 ―:連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (1/2 ページ)
ASP.NETページの先頭に記述する@Pageディレクティブでは、ページ生成に関する多様な属性を指定する。後編ではこれについて詳しく見る。
@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>
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>
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);
}
}
Copyright© Digital Advantage Corp. All Rights Reserved.