CustomValidator コントロール
入力コントロール内の値を評価し、カスタマイズされた検証ロジックを通過するかどうかを確認します。
<asp:CustomValidator
id="ProgrammaticID"
ControlToValidate="programmatic ID of Server Control to Validate"
ClientValidationFunction="ClientValidateID"
OnServerValidate="ServerValidateID"
ErrorMessage="Message to display in ValidationSummary control"
Text="Message to display in control"
ForeColor="value"
BackColor="value" ...
runat="server" >
</asp:CustomValidator>
解説
CustomValidator コントロールを使用して、カスタマイズされた検証ロジックを持つ検証コントロールを作成できます。たとえば、テキスト ボックスに入力された値が偶数かどうかを確認する検証コントロールを作成できます。
検証コントロールは、常にサーバー上で検証を行います。これらの検証コントロールは、DHTML をサポートするブラウザ (Microsoft Internet Explorer 4.0 以降など) がクライアント上で検証を実行できるようにするための、完全なクライアント側の実装も備えています。クライアント側で検証を行うと、ユーザーが入力したデータをサーバーに送信する前にチェックできるため、検証プロセスが強化されます。これにより、フォームが送信される前にクライアント側でエラーを検出できるため、サーバー側での検証で必要となる情報のラウンドトリップが不要になります。
サーバー側の検証関数を作成するには、検証を実行する ServerValidate イベントのハンドラを作成します。検証対象の入力コントロール内の文字列にアクセスするには、このイベント ハンドラにパラメータとして渡された ServerValidateEventArgs オブジェクトの Value プロパティを使用します。検証の結果は、ServerValidateEventArgs オブジェクトの IsValid プロパティに格納されます。
クライアント側の検証関数を作成するには、まず、上の手順に従ってサーバー側の検証関数を追加します。次に、クライアント側の検証スクリプト関数を .aspx ページに追加します。
VBScript を使用している場合は、次の形式で関数を記述する必要があります。
Sub ValidationFunctionName (source, arguments)
JScript を使用している場合は、次の形式で関数を記述する必要があります。
Function ValidationFunctionName (source, arguments)
ClientValidationFunction プロパティを使用して、CustomValidator コントロールに関連付けられたクライアント側の検証スクリプト関数の名前を指定します。スクリプト関数はクライアント側で実行されるため、対象とするブラウザがサポートしている VBScript や JScript などの言語で作成する必要があります。
サーバー側の検証と同様に、検証対象の値にアクセスするには、arguments パラメータの Value プロパティを使用します。検証の結果を返すには、arguments パラメータの IsValid プロパティを設定します。
**注意 **クライアント側の検証関数を作成する場合は、サーバー側の検証関数の機能も必ず作成してください。対応するサーバー側の関数がないクライアント側の検証関数を作成した場合は、悪意のあるコードが検証を省略できてしまう可能性が生まれます。
複数の検証コントロールを同じ入力コントロールに関連付け、その入力コントロールに対して異なる基準で検証を実行できます。たとえば、買い物カゴに追加する商品の数量をユーザーが入力できるようになっている TextBox コントロールに、複数の検証コントロールを適用できます。CustomValidator コントロールを使用して、指定された値が在庫数を上回っていないことを確認し、RequiredFieldValidator コントロールを使用して、ユーザーが TextBox コントロールに値を入力したかどうかを確認できます。
メモ 入力コントロールが空の場合、検証関数は呼び出されず、そのまま検証が成功します。ユーザーが入力コントロールへの入力を省略しないようにする場合は、RequiredFieldValidator コントロールを使用します。
CustomValidator コントロールは、ControlToValidate プロパティを設定しなくても使用できます。通常、この方法は、複数の入力コントロールを検証する場合や、検証コントロールとは併用できない入力コントロール (CheckBox コントロールなど) を検証する場合に使用されます。この場合、ServerValidate イベントのイベント ハンドラやクライアント側の検証関数に渡される arguments パラメータの Value プロパティに、必ず空の文字列 ("") が含まれます。ただし、これらの検証関数は依然として、サーバーとクライアントの両方で検証を行うために適切な場所で呼び出されます。検証対象の値にアクセスするには、検証対象の入力コントロールをプログラムによって参照し、適切なプロパティの値を取得する必要があります。たとえば、CheckBox コントロールをサーバー上で検証するには、検証コントロールの ControlToValidate プロパティは設定せずに、ServerValidate イベントのハンドラとして次のコードを使用します。
Sub ServerValidation (source As object, args As ServerValidateEventArgs)
args.IsValid = (CheckBox1.Checked = True)
End Sub
[C#]
void ServerValidation (object source, ServerValidateEventArgs args)
{
args.IsValid = (CheckBox1.Checked == true);
}
CustomValidator コントロールの詳細については、CustomValidator クラスのトピックを参照してください。
例
テキスト ボックスに入力された値が偶数かどうかをサーバー上で検証する CustomValidation コントロールの作成方法を次の例に示します。検証後に、その結果がページに表示されます。
<%@ Page Language="VB" AutoEventWireup="True" %>
<html>
<head>
<script runat="server">
Sub ValidateBtn_OnClick(sender As object, e As EventArgs)
If Page.IsValid Then
lblOutput.Text = "Page is valid."
Else
lblOutput.Text = "Page is not valid!"
End If
End Sub
Sub ServerValidation (source As object, arguments As ServerValidateEventArgs)
Dim num As Integer = Integer.Parse(arguments.Value)
arguments.IsValid = ((num mod 2) = 0)
End Sub
</script>
</head>
<body>
<form runat="server">
<h3>CustomValidator Example</h3>
<asp:Label id=lblOutput runat="server"
Text="Enter an even number:"
Font-Name="Verdana"
Font-Size="10pt" /><br>
<p>
<asp:TextBox id="Text1"
runat="server" />
<asp:CustomValidator id="CustomValidator1"
ControlToValidate="Text1"
OnServerValidate="ServerValidation"
Display="Static"
ErrorMessage="Not an even number!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<p>
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</form>
</body>
</html>
[C#]
<%@ Page Language="C#" AutoEventWireup="True" %>
<html>
<head>
<script runat="server">
void ValidateBtn_OnClick(object sender, EventArgs e)
{
if (Page.IsValid)
{
lblOutput.Text = "Page is valid.";
}
else
{
lblOutput.Text = "Page is not valid!";
}
}
void ServerValidation (object source, ServerValidateEventArgs arguments)
{
int i = int.Parse(arguments.Value);
arguments.IsValid = ((i%2) == 0);
}
</script>
</head>
<body>
<form runat="server">
<h3>CustomValidator Example</h3>
<asp:Label id=lblOutput runat="server"
Text="Enter an even number:"
Font-Name="Verdana"
Font-Size="10pt" /><br>
<p>
<asp:TextBox id="Text1"
runat="server" />
<asp:CustomValidator id="CustomValidator1"
ControlToValidate="Text1"
OnServerValidate="ServerValidation"
Display="Static"
ErrorMessage="Not an even number!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<p>
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</form>
</body>
</html>
次の例は、前の例と同じ検証ルーチンをクライアント側で実行する CustomValidation コントロールの作成方法を示しています。
<%@ Page Language="VB" AutoEventWireup="True" %>
<html>
<head>
<script runat="server">
Sub ValidateBtn_OnClick(sender As object, e As EventArgs)
If Page.IsValid Then
lblOutput.Text = "Page is valid."
Else
lblOutput.Text = "Page is not valid!"
End If
End Sub
Sub ServerValidation (source As object, arguments As ServerValidateEventArgs)
Dim num As Integer = Integer.Parse(arguments.Value)
arguments.IsValid = ((num mod 2) = 0)
End Sub
</script>
</head>
<body>
<form runat="server">
<h3>CustomValidator Example</h3>
<asp:Label id=lblOutput runat="server"
Text="Enter an even number:"
Font-Name="Verdana"
Font-Size="10pt" /><br>
<p>
<asp:TextBox id="Text1"
runat="server" />
<asp:CustomValidator id="CustomValidator1"
ControlToValidate="Text1"
ClientValidationFunction="ClientValidate"
OnServerValidate="ServerValidation"
Display="Static"
ErrorMessage="Not an even number!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<p>
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</form>
</body>
</html>
<script language="vbscript">
<!--
Sub ClientValidate(source, arguments)
If (arguments.Value mod 2) = 0 Then
arguments.IsValid=true
Else
arguments.IsValid=false
End If
End Sub
' -->
</script>
[C#]
<%@ Page Language="C#" AutoEventWireup="True" %>
<html>
<head>
<script runat="server">
void ValidateBtn_OnClick(object sender, EventArgs e)
{
if (Page.IsValid)
{
lblOutput.Text = "Page is valid.";
}
else
{
lblOutput.Text = "Page is not valid!";
}
}
void ServerValidation (object source, ServerValidateEventArgs arguments)
{
int i = int.Parse(arguments.Value);
arguments.IsValid = ((i%2) == 0);
}
</script>
</head>
<body>
<form runat="server">
<h3>CustomValidator Example</h3>
<asp:Label id=lblOutput runat="server"
Text="Enter an even number:"
Font-Name="Verdana"
Font-Size="10pt" /><br>
<p>
<asp:TextBox id="Text1"
runat="server" />
<asp:CustomValidator id="CustomValidator1"
ControlToValidate="Text1"
ClientValidationFunction="ClientValidate"
OnServerValidate="ServerValidation"
Display="Static"
ErrorMessage="Not an even number!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<p>
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</form>
</body>
</html>
<script language="vbscript">
Sub ClientValidate(source, arguments)
If (arguments.Value mod 2) = 0 Then
arguments.IsValid=true
Else
arguments.IsValid=false
End If
End Sub
</script>
[JScript]
<%@ Page Language="JScript" AutoEventWireup="True" %>
<html>
<head>
<script runat="server">
function ValidateBtn_OnClick(sender:Object, e:EventArgs) : void
{
if (Page.IsValid)
{
lblOutput.Text = "Page is valid!";
}
else
{
lblOutput.Text = "Page is not valid!";
}
}
function ServerValidation(sender:Object, value:ServerValidateEventArgs) : void
{
var i:int = Int32.Parse(value.Value);
value.IsValid = (i%2 == 0);
return;
}
</script>
</head>
<body>
<form runat="server">
<h3>CustomValidator Example</h3>
<asp:Label id=lblOutput runat="server"
Text="Enter an even number:"
Font-Name="Verdana"
Font-Size="10pt" /><br>
<p>
<asp:TextBox id="Text1"
runat="server" />
<asp:CustomValidator id="CustomValidator1"
ControlToValidate="Text1"
ClientValidationFunction="ClientValidate"
OnServerValidate="ServerValidation"
Display="Static"
ErrorMessage="Not an even number!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<p>
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</form>
</body>
</html>
<script language="javascript">
<!--
function ClientValidate(source, arguments)
{
if ((arguments.Value % 2) == 0)
arguments.IsValid=true;
else
arguments.IsValid=false;
}
// -->
</script>