.NET TIPS

[ASP.NET]検証コントロールで条件付きの検証処理を行うには?

山田 祥寛
2004/12/03

 通常、検証コントロールはあらかじめ必要なパラメータ(プロパティ値)を設定しておくだけで、ほとんどコードを記述することなくユーザー入力を検証することができる。ASP.NETの検証コントロールの詳しい使い方については、別稿「Visual Studio.NETでプログラム・レス開発を学ぶ(前編)」などを併せて参照するとよいだろう。

 しかし、検証コントロールのパラメータが必ずしも実行前に決まるとは限らない。例えば以下は、配送サービスを提供するサイトなどでよく見掛けるような「配送希望時刻」の指定画面だ。

配達希望時刻を指定する画面のサンプル

 このようなフォームにおいて、「配達希望時刻」は「配達時刻指定」のチェックボックスが有効である場合にのみ必須とすべき「条件付き」必須項目だ。このように、ほかの入力項目の値によってチェックの内容が変動することはよくあるケースだが、こうした「条件付き検証」の機能は、現時点の検証コントロールでは標準では提供されていない。

 そこで本稿では、上のようなフォームで「条件付き検証」を実現するコードの記述方法を紹介する。まず、この機能を実装したサンプル・プログラムを示す。

<%@ Page ContentType="text/html" Language="C#" %>
<script runat="Server">
// チェックボックスの有効/無効を切り替えたタイミングで呼び出し
// <asp:RequiredFieldValidator>コントロールの有効/無効を切り替える
void chk_CheckedChanged(Object sender, EventArgs e){
  if (chk.Checked) {
    txtReq.Enabled = true;
  }else{
    txtReq.Enabled = false;
  }
}
void btn_Click(Object sender, EventArgs e){
  if (Page.IsValid) {
    Response.Write("OK");
    // 任意の処理
  }
}
</script>
<html>
<head>
<title>配達希望時間の指定</title>
</head>
<body>
<h1 style="color:white;background:#525D76">配達希望時間の指定</h1>
<form runat="Server">
<table border="0">
<tr>
  <th align="right">配達時刻指定:</th>
  <td>
    <asp:CheckBox id="chk" runat="Server"
      AutoPostBack="True" OnCheckedChanged="chk_CheckedChanged" />
  </td>
</tr>
<tr>
  <th align="right">配達希望時刻:</th>
  <td>
    <asp:TextBox id="txt" runat="Server" />
    <asp:RequiredFieldValidator id="txtReq" runat="Server" Enabled="False"
      ControlToValidate="txt" ErrorMessage="配達希望時刻は必須です。" />
  </td>
</tr>
<tr>
  <td rowspan="2"><asp:Button id="btn" runat="Server"
    Text="登録" OnClick="btn_Click" /></td>
</tr>
</table>
</form>
</body>
</html>
条件付き検証を行うための.aspxファイル(C#の場合)
 
<%@ Page ContentType="text/html" Language="VB" %>
<script runat="Server">
' チェックボックスの有効/無効を切り替えたタイミングで呼び出し
' <asp:RequiredFieldValidator>コントロールの有効/無効を切り替える
Sub chk_CheckedChanged(sender As Object, e As EventArgs)
  If chk.Checked Then
    txtReq.Enabled=True
  Else
    txtReq.Enabled=False
  End If
End Sub
Sub btn_Click(sender As Object, e As EventArgs)
  If Page.IsValid Then
    ' 任意の処理
  End If
End Sub
</script>
<html>
<head>
<title>配達希望時間の指定</title>
</head>
<body>
<h1 style="color:white;background:#525D76">配達希望時間の指定</h1>
<form runat="Server">
<table border="0">
<tr>
  <th align="right">配達時刻指定:</th>
  <td>
    <asp:CheckBox id="chk" runat="Server"
      AutoPostBack="True" OnCheckedChanged="chk_CheckedChanged" />
  </td>
</tr>
<tr>
  <th align="right">配達希望時刻:</th>
  <td>
    <asp:TextBox id="txt" runat="Server" />
    <asp:RequiredFieldValidator id="txtReq" runat="Server" Enabled="False"
      ControlToValidate="txt" ErrorMessage="配達希望時刻は必須です。" />
  </td>
</tr>
<tr>
  <td rowspan="2"><asp:Button id="btn" runat="Server"
    Text="登録" OnClick="btn_Click" /></td>
</tr>
</table>
</form>
</body>
</html>
条件付き検証を行うための.aspxファイル(VB.NETの場合)

 上記のコードでポイントとなるのは、chk_CheckedChangedメソッドに記述された、検証コントロールのEnabledプロパティの切り替えだ。チェックボックスの定義ではAutoPostBackプロパティをTrueに設定しているため、チェックボックスが変更されたときに、このメソッドが実行される。

 このメソッドでは、チェックボックスが有効であるかどうかによって、対応する検証コントロールの有効/無効を切り替えればよい。これによって、「配達時間を指定する」にチェックが入っている場合にのみ、「配達時間」を有効にすることができる。

 以下は、上記のコードの実行結果だ。

条件付き検証コントロールを実行したところ
「配達時刻指定」にチェックを付けており、かつ、「配達希望時刻」が未入力の場合はエラーとなる。

 ただし、AutoPostBackプロパティを有効にしたコントロールでは、その内容が変更されるたびにクライアント/サーバ間の通信が発生するため、処理上のオーバーヘッドが大きい。こうした条件付き検証項目があまりに多い場合には、Enabledプロパティの切り替えを(変更イベントではなく)[登録]ボタンなどのクリック・イベントのタイミングで行うようにするのが好ましい。その方法については、「[ASP.NET]検証コントロールのパラメータを動的に設定するには?」で紹介している。End of Article

カテゴリ:Webフォーム 処理対象:検証
使用ライブラリ:RequiredFieldValidatorコントロール
使用ライブラリ:CheckBoxコントロール
関連TIPS:[ASP.NET]検証コントロールのパラメータを動的に設定するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]CustomValidatorコントロールでマスタ重複チェックを実装するには?
[ASP.NET]CustomValidatorコントロールでクライアント検証を有効にするには?
[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 記事ランキング

本日 月間