検証するテキストボックスが空の時に CustomValidator のServerValidateイベントが実行されない - ASP.NET

検証するテキストボックスが空の時に CustomValidator のServerValidateイベントが実行されないことがあります。

現象の確認

プログラム

UI

以下のUIを作成します。TextBox, CustomValidator, Button, Labelを配置します。CustomValidatorのControlToValidate プロパティに配置したTextBoxのIDを指定します。また、EnableClientScriptプロパティを"False"に設定します。

UIのコード
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm_BlankInput.aspx.cs" Inherits="CustomValidatorDemo.WebForm_BlankInput" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
      <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="入力形式が不正です" ControlToValidate="TextBox1" EnableClientScript="False" OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
      <div>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
      </div>
      <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
      </div>

    </div>

    </form>
</body>
</html>

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomValidatorDemo
{
  public partial class WebForm_BlankInput : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
      if (Page.IsValid == true) {
        Label1.Text = TextBox1.Text + "が入力されました。";
      }
      else {
        Label1.Text = "";
      }
    }

    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
      if (args.Value == "") {
        args.IsValid = false;
      }
      else if (args.Value[args.Value.Length-1] == '。') {
        args.IsValid = true;
      }else{
        args.IsValid = false;
      }

    }
  }
}
解説
CustomValidatorを用いてサーバー側で入力を検証します。入力文字列が空欄、もしくは入力文字列の末尾が"。"でない場合は正しくない形式と判断します。

実行結果

プロジェクトを実行します。Webブラウザが起動し、下図の画面が表示されます。


テキストボックスに"しろくま。"を入力し、ボタンをクリックします。文字列の末尾が"。"ですので、正しい入力と判定され下部のラベルに入力した文字列が表示されます。


テキストボックスに"ABC"を入力し、ボタンをクリックします。末尾が"。"でないため、不正な入力のメッセージを表示します。

テキストボックスを空欄のままでボタンをクリックします。ロジックでは不正な入力になるはずですが、CustomValidatorのエラーメッセージは表示されません。

原因

CustomValidatorはデフォルトでは入力が空の場合は検証を実行しないためです。入力が空の場合の検証は、RequiredFieldValidatorで検証するためCustomValidatorでは空の検証をしないようになっているようです。

対策

CustomValidatorで空の入力も検証する場合は、ValidateEmptyTextプロパティを"true"に設定します。

フォームデザイナでCustomValidatorを選択しプロパティウィンドウを表示します。"ValidateEmptyText"の値が"False"になっているはずですので、"True"に変更します。

実行結果

プロジェクトを実行します。Webブラウザが起動し、下図の画面が表示されます。


テキストボックスを空欄にしたままボタンをクリックします。CustomValidatorのServerValidateイベントが実行され、入力形式が不正な旨のエラーが表示されました。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2014-07-13
iPentec all rights reserverd.