.NET TIPS

[ASP.NET]CustomValidatorコントロールでマスタ重複チェックを実装するには?

山田 祥寛
2004/12/17

 ASP.NETには、検証サーバ・コントロール(以下、検証コントロール)と呼ばれる入力データ検証用のコントロールが豊富に用意されている。これら検証コントロールを利用することで、必須、範囲、比較、データ型、正規表現パターンなどの、基本的なデータ検証をプログラムレスで(コードを手動で記述することなく)実現できる。

 しかし、実際にアプリケーションを構築していく中では、決してそのような単純な検証だけではない。例えば、複数の入力要素を複合的にチェックしたり、データベース上のデータとの整合を確認したりと、より複雑な検証ロジックを必要とする局面は多く存在する。そこで登場するのが、CustomValidatorコントロールだ。

 CustomValidatorコントロールは、名前からも容易に想像できるように、標準の検証コントロールでは対応できない独自の検証ロジックを実装するためのコントロールだ。本稿では、CustomValidatorコントロールを利用して、データベース上のレコード重複チェックの機能を実装してみることにしよう。なお、本稿で示しているサンプル・プログラムを実行するには、あらかじめデータベース上に以下のようなテーブルを作成しておく必要がある。

フィールド名 データ型 概要
isbn VARCHAR(30) ISBNコード(主キー)
title VARCHAR(100) 書名
publish VARCHAR(20) 出版社
booksテーブルのフィールド・レイアウト

 以下は、実際にCustomValidatorコントロールを利用して、レコードの重複チェック機能を実装したコードだ。

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
void customValid_ServerValidate(Object sender, ServerValidateEventArgs e) {
  // ISBNコードをキーにbooksテーブルを検索
  SqlConnection objDb = new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  SqlCommand objCom = new SqlCommand("SELECT * FROM books WHERE isbn=@isbn",objDb);
  objCom.Parameters.Add("@isbn",e.Value);
  objDb.Open();
  SqlDataReader objDr = objCom.ExecuteReader();
  // レコードを取得できなかったら、データが重複していないので検証は成功
  e.IsValid = !objDr.HasRows;
  objDb.Close();
}
void objBtn_Click(Object sender, EventArgs e) {
  if(Page.IsValid){
    // 検証に成功した場合の処理を記述
  }
}
</script>
<html>
<head>
<title>CustomValidatorコントロールによる重複チェック</title>
</head>
<body>
<form runat="server">
ISBNコード:
<asp:TextBox id="isbn" runat="Server" Size="15" MaxLength="13" />
<asp:CustomValidator id="customValid" runat="Server"
  ControlToValidate="isbn" EnableClientScript="False"
  OnServerValidate="customValid_ServerValidate" Display="Dynamic"
  ErrorMessage="ISBNコードが重複しています。" /><br />
タイトル:
<asp:TextBox id="title" runat="Server" Size="35" MaxLength="100" /><br />
出版社:
<asp:TextBox id="publish" runat="Server" Size="20" MaxLength="15" /><br />
<asp:Button id="objBtn" runat="Server" Text="登録" OnClick="objBtn_Click" />
</form>
</body>
</html>
レコード重複チェック機能を実装する.aspxファイル(C#の場合)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Sub customValid_ServerValidate(sender As Object, e As ServerValidateEventArgs)
  ' ISBNコードをキーにbooksテーブルを検索
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  Dim objCom As New SqlCommand("SELECT * FROM books WHERE isbn=@isbn",objDb)
  objCom.Parameters.Add("@isbn",e.Value)
  objDb.Open()
  Dim objDr As SqlDataReader = objCom.ExecuteReader()
  ' レコードを取得できなかったら、データが重複していないので検証は成功
  e.IsValid = (Not objDr.HasRows)
  objDb.Close()
End Sub
Sub objBtn_Click(sender As Object, e As EventArgs)
  If Page.IsValid Then
    ' 検証に成功した場合の処理を記述
  End If
End Sub
</script>
<html>
<head>
<title>CustomValidatorコントロールによる重複チェック</title>
</head>
<body>
<form runat="server">
ISBNコード:
<asp:TextBox id="isbn" runat="Server" Size="15" MaxLength="13" />
<asp:CustomValidator id="customValid" runat="Server"
  ControlToValidate="isbn" EnableClientScript="False"
  OnServerValidate="customValid_ServerValidate" Display="Dynamic"
  ErrorMessage="ISBNコードが重複しています。" /><br />
タイトル:
<asp:TextBox id="title" runat="Server" Size="35" MaxLength="100" /><br />
出版社:
<asp:TextBox id="publish" runat="Server" Size="20" MaxLength="15" /><br />
<asp:Button id="objBtn" runat="Server" Text="登録" OnClick="objBtn_Click" />
</form>
</body>
</html>
レコード重複チェック機能を実装する.aspxファイル(VB.NETの場合)

 CustomValidatorコントロールでは、サーバ側の検証メソッド(上記のコード例では、customValid_ServerValidateメソッド)をOnServerValidate属性で指定できる。ポストバックが発生したタイミングで、指定された検証メソッドが呼び出され、検証処理が行われるというわけだ。

 検証対象となる入力コントロールの値には、検証メソッドのパラメータとして渡されるServerValidateEventArgsオブジェクト(System.Web.UI.WebControls名前空間)のValueプロパティを介してアクセスすることが可能だ。ここでは、取得した値(ISBNコード)をキーにbooksテーブルを検索し、同一のISBNコードを持つレコードが存在するかどうかを確認している。

 検証結果は、ServerValidateEventArgsオブジェクトのIsValidプロパティにTrue/Falseでセットすればよい。IsValidプロパティがTrueである場合にCustomValidatorコントロールは検証処理に成功したものと見なす。

 以下は、上記のサンプル・コードで重複するISBNコードを入力した場合の実行結果だ。本サンプルを試す場合には、あらかじめbooksテーブルに適当な値をセットしたうえで、Webフォームから重複するISBNコードを入力してみていただきたい。以下の画面は、試しに実行した結果だ。

マスタ重複チェックによりエラーが発生したところ
booksテーブルに重複するISBNコードを持つレコードが存在する場合はエラーとなる。

 なお、本稿では検証に際してデータベース・サーバにアクセスする必要があるため、CustomValidatorコントロールのEnableClientScript属性によりクライアントサイドにおける検証処理を無効にしている(デフォルトでは有効になっている)。しかし、無用な通信トラフィックを減らすためにも、可能な場合には、クライアントサイドの検証は有効のままにしておくことが好ましい。

 CustomValidatorコントロールでクライアント検証を有効にする方法については、「TIPS:[ASP.NET]CustomValidatorコントロールでクライアント検証を有効にするには?」で紹介している。End of Article

カテゴリ:Webフォーム 処理対象:検証
使用キーワード:CustomValidatorコントロール
使用ライブラリ:ServerValidateEventArgsクラス(System.Web.UI.WebControls名前空間)
関連TIPS:[ASP.NET]CustomValidatorコントロールでクライアント検証を有効にするには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]CustomValidatorコントロールでクライアント検証を有効にするには?
[ASP.NET]複数のボタンを持つフォームで検証コントロールを利用するには?
[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 記事ランキング

本日 月間