ASP.NET ページのページはどこから派生しているか?
ASP.NET ページはコンパイルされて実行されます。 スクリプト言語ではなく、コンパイルが必要な C# や VB.NET を使っているので、 裏側でどうしてもそうした処理が必要になります。
ここでは、ASP.NET ページがコンパイルされる様子と、そのコンパイルの状況からいくつか実験をしてみようと思います。
ASP.NET ページの型を見る
次のようなページを利用して、ASPX ファイルが実際にどのような型になるか確認してみましょう。
このページは getTypes.aspx という名前にしました。
<%@ Page Language="C#" %> <html> <body> <p style="font-size:large;"> <% Type t; t = this.GetType(); while(true) { Response.Write( t.ToString() + "<br>" ); if ( t == typeof( System.Object ) ) { break; } t = t.BaseType; }; %> </p> </body> </html>
出力は次のようになります。
- ASP.gettypes_aspx
- System.Web.UI.Page
- System.Web.UI.TemplateControl
- System.Web.UI.Control
- System.Object
これはコールスタックならぬ、派生スタック(?)とでもいいましょうか、上から下に向かってその親クラスが出力されています。
上の結果から getTypes.aspx というページは、ASP.gettypes_aspx という型 (クラス) のオブジェクトとして実行されたことがわかります。 そして、ASP.gettypes_aspx は System.Web.UI.Page から派生され、さらに System.Web.UI.TemplateControl、 System.Web.UI.Control、System.Object と続きます。
別ファイルにコードを書く (コードビハインド) 場合
上の例では ASPX ファイルに直接 C# コードを記述しましたが、次は、コードを ASPX とは別のファイルに記述した場合 (コードビハインドの場合) はどうなるかみてみましょう。
C# のコードを次のように記述し、getTypes2.aspx.cs として保存します。
using System; namespace MyTest { public partial class getTypes2 : System.Web.UI.Page { public void ShowType() { Type t; t = this.GetType(); while ( true ) { Response.Write( t.ToString() + "<br>" ); if ( t == typeof( System.Object ) ) { break; } t = t.BaseType; }; } } }
これを利用する ASPX ページを次のように記述し、getTypes2.aspx とします。
<%@ Page Language="C#" CodeFile="~/getTypes2.aspx.cs" Inherits="MyTest.getTypes2" %> <html> <body> <p style="font-size:large;"> <% ShowType(); %> </p> </body> </html>
C# で定義したクラス getType2 は System.Web.UI.Page から派生してますし、ASPX ファイルのディレクティブで
Inherits キーワードでクラスを指定しているなど、このコードの書き方からクラスの継承関係は自明といえば自明ですが・・・
ともあれ、試した結果は次のとおりです。
コードファイルで定義したクラスは、ASPX で自動作成されるクラスの親クラスとなっていることが確認できました。
以上から、コードビハインドで作成したコードは ASPX の親クラスになるんだなぁ、というよく知られた結果になるわけですが・・・
よく見ると、コードビハインドで作成したクラス定義は partial 指定になっています。
partial ということは、もうひとつ以上、このクラスを定義するのに必要なファイルがあるはずです。 この点についてもう少し調べてみましょう。