.NET TIPS

[ASP.NET]アプリケーション共通の処理をPage派生クラスで実装するには?

山田 祥寛
2005/04/29

 「TIPS:[ASP.NET]検証コントロールのエラー・メッセージを一元管理するには?」では、ASP.NETの検証コントロールで出力するエラー・メッセージを一元的に管理する方法について紹介した。そのTIPSでは、分かりやすさを優先してメッセージ生成のロジックを.aspxファイル上にまとめて記述しているが、本来、こうしたアプリケーション共通の処理はどこか1カ所で共通的に定義するのが好ましい。

 アプリケーション共通の処理を記述するには、Global.asaxやHTTPモジュールを利用する方法もあるが、今回の例のように、Pageクラス(System.Web.UI名前空間。ASP.NETにおけるWebページの実体)にアクセスする処理を記述しなければならない場合には、Pageクラスを継承した独自のクラス(Page派生クラス)を定義する方が便利だ。

 Page派生クラスにアプリケーション共通の処理を定義すれば、個々のWebフォームはこのPage派生クラスから継承するだけでその処理を実装することができる。

Page派生クラスを利用した共通機能の実装

●Page派生クラスを作成する

 それでは、実際にPage派生クラスを利用したアプリケーション共通機能の実装例を見てみよう。

 本稿では、「TIPS:[ASP.NET]検証コントロールのエラー・メッセージを一元管理するには?」で紹介したvalidateManage_cs.aspx/validateManage_vb.aspxを、Page派生クラスを利用して書き直してみることにする。なお、メソッド内部のロジックについては、前掲のTIPSでも紹介したとおりなので、詳しくはそちらをご覧いただきたい。

 以下の実装例では、Pageクラスから派生したMyPageクラスを記述している。

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

namespace Wings {
  public class MyPage : Page {
    protected override void OnLoad(EventArgs e){
      base.OnLoad(e);
      ……(ページ内の検証コントロールをチェックするコード)……
    }
  }
}
Page派生クラスによる実装例(C#版:MyPage.cs)
 
Imports System
Imports System.Collections
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace Wings
  Public Class MyPage
    Inherits Page
    Protected Overrides Sub OnLoad(e As EventArgs)
     
MyBase.OnLoad(e)
      ……(ページ内の検証コントロールをチェックするコード)……
    End Sub
  End Class
End Namespace
Page派生クラスによる実装例(VB.NET版:MyPage.vb)

 Page派生クラスを定義するために最低限必要な条件は、以下の2点だ。

  1. System名前空間、System.Web.UI名前空間、System.Web.UI.WebControls名前空間をインポートすること

  2. Pageクラス(System.Web.UI名前空間)を継承すること

 MyPage.vb(またはMyPage.cs)を使用するに先立って、あらかじめコマンド・プロンプトからこれをコンパイルしておく必要がある。コンパイルの構文は以下のとおり。

>csc /t:library MyPage.cs
Page派生クラス(MyPage.cs)のコンパイル方法(C#の場合)
 
>vbc /t:library /r:System.dll /r:System.Web.dll MyPage.vb
Page派生クラス(MyPage.vb)のコンパイル方法(VB.NETの場合)

 コンパイルの結果、作成されたMyPage.dllはアプリケーション・ルート配下の「bin」フォルダに配置しておくこと。

●Page派生クラスを利用(継承)する

 次に、Page派生クラス(本稿ではMyPageクラス)を継承した個別のページを作成し、実際にMyPageクラスでの定義内容が個別のページに適用されていることを確認してみよう。

<%@ Page ContentType="text/html" Inherits="Wings.MyPage" %>
<html>
<head>
<title>エラー・メッセージの一元管理</title>
</head>
<body>
<h1>エラー・メッセージの一元管理</h1>
<form runat="server">

名前:<asp:TextBox id="txtNam" runat="Server" Size="20" />

<asp:RequiredFieldValidator id="reqNam" runat="Server"
  ControlToValidate="txtNam" ErrorMessage="名前" /><br />

年齢:<asp:TextBox id="txtOld" runat="Server" Size="3" />歳

<asp:RangeValidator id="rngOld" runat="Server"
  ControlToValidate="txtOld" MinimumValue="0" MaximumValue="150"
  ErrorMessage="年齢" />

<asp:CompareValidator id="cmpOld" runat="Server"
  ControlToValidate="txtOld" Type="Integer"
  Operator="DataTypeCheck" ErrorMessage="年齢" /><br />

E-Mail:<asp:TextBox id="txtMail" runat="Server" Size="40" />

<asp:RegularExpressionValidator id="regMail" runat="Server"
  ControlToValidate="txtMail" ErrorMessage="E-Mail"
  ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" /><br />

<asp:Button id="btnSend" runat="Server" Text="送信" />

</form>
</body>
</html>
Page派生クラス(MyPageクラス)を適用したWebフォームの例(ValidateManage.aspx)

 Page派生クラスを適用するのは簡単だ。@PageディレクティブのInherits属性から適用したいPage派生クラスの完全修飾名(ここでは「Wings.MyPage」)を指定するだけでよい。あとはWebフォーム(ValidateManage.aspx)を実行して、前掲のTIPSと同様の結果が確認できれば成功だ。

 なお、本稿では個別のWebフォーム上でPage派生クラスを宣言しているが、代わりにweb.configで宣言することもできる。上記のWebフォーム(ValidateManage.aspx)からInherits属性の記述を取り除き、以下のようなweb.configを記述してみてほしい。やはり同様の結果が得られるはずだ。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.web>
    <pages pageBaseType="Wings.MyPage, MyPage" />
  </system.web>
</configuration>
Page派生クラスの適用を宣言したweb.config
個別のWebフォーム上でPage派生クラスを宣言する代わりに、web.configで宣言することもできる。

 <page>要素のpageBaseType属性には「型名,アセンブリ名」の形式で値を設定すること(上記の例では「Wings.MyPage, MyPage」と指定している)。End of Article

カテゴリ:Webフォーム 処理対象:検証
使用ライブラリ:Pageクラス(System.Web.UI名前空間)
関連TIPS:[ASP.NET]検証コントロールのエラー・メッセージを一元管理するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]検証コントロールのエラー・メッセージを一元管理するには?
[ASP.NET]ページから生成されたソース・コードを見るには?
基本フォームから継承された内容を派生フォームでカスタマイズするには?
[ASP.NET]サイト共通のレイアウト部分を部品化するには?
各フォームの共通要素を基本フォームにまとめるには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間