使用 CustomValidator 控件为输入控件提供用户定义的验证函数。CustomValidator 控件是不同于它所验证的输入控件的另一个控件,它使您可以控制显示验证消息的位置。
验证控件总是在服务器上执行验证。它们还具有完整的客户端实现,从而使支持脚本的浏览器(如 Microsoft Internet Explorer 4.0 以及更高版本)可以在客户端上执行验证。客户端验证通过在向服务器发送用户输入前检查用户输入来增强验证过程。这使得在提交窗体前即可在客户端检测到错误,从而避免了服务器端验证所需要的信息的往返行程。
若要创建服务器端验证函数,请为执行验证的 ServerValidate 事件提供一个处理程序。可以通过使用作为参数传递到该事件处理程序的 ServerValidateEventArgs 对象的 Value 属性来访问要验证的输入控件中的字符串。然后将验证的结果存储在 ServerValidateEventArgs 对象的 IsValid 属性中。
若要创建客户端验证函数,首先要添加前面描述的服务器端验证函数。然后,将客户端验证脚本函数添加到 ASP.NET (.aspx) 页中。
如果使用的是 Visual Basic Scripting Edition (VBScript),该函数必须采用下面的形式:
Sub ValidationFunctionName(source, arguments)
如果使用的是 JScript,则该函数必须采用下面的形式:
function ValidationFunctionName(source, arguments)
source 参数是对为 CustomValidator 控件呈现的 <span> 元素的引用。因此,您可以编程的方式控制 <span> 标记,如修改 InnerHtml 属性。arguments 参数是一个具有以下两个属性的对象:Value 和 IsValid。使用此参数可以获取控件的值,以根据自定义验证例程验证并指示该值是否有效。
使用 ClientValidationFunction 属性指定与 CustomValidator 控件关联的客户端验证脚本函数的名称。由于该脚本函数在客户端执行,因此该函数必须使用目标浏览器支持的语言(如 VBScript 或 JScript)来编写。
说明: 当使用 UpdatePanel 控件内部的 CustomValidator 控件时,请确保该验证程序控件与关联的控件位于同一面板中。
与服务器端验证一样,可以通过使用 arguments 参数的 Value 属性来访问要验证的输入控件中的字符串。通过设置 arguments 参数的 IsValid 属性返回验证结果。
警告: 在使用验证程序控件时,应该始终首先检查服务器端验证的结果,然后再执行处理。在回发之后但调用事件方法之前,该页将调用验证程序控件并将它们的结果聚集到 Page..::.IsValid 属性中。(您还可以使用 Validate 方法显式调用验证程序控件。) 在您自己的代码中,应该先检查 Page.IsValid 属性是否返回了 true,然后再处理输入。即使支持脚本的浏览器可能在验证检查失败时禁止客户端上发生回发,您也应该总是先检查服务器代码中的 Page.IsValid,然后再处理验证的数据。
多个验证控件可以与单个输入控件一起使用来验证不同的判据。例如,可以在使用户可以输入要添加到购物车中的货物数量的 TextBox 控件上应用多个验证控件。您可以使用 CustomValidator 控件确保所指定的值小于库存的数量,并使用 RequiredFieldValidator 控件确保用户将值输入到 TextBox 控件中。
说明: 如果输入控件为空,则不会调用任何验证函数,并且验证将成功。使用 RequiredFieldValidator 控件要求用户在输入控件中输入数据。
可以在不设置 ControlToValidate 属性的情况下使用 CustomValidator 控件。这种情况通常出现在验证多个输入控件或是验证无法与验证控件一起使用的输入控件(如 CheckBox 控件)时。这种情况下,传递给 ServerValidate 事件的事件处理程序及客户端验证函数的 arguments 参数的 Value 属性将始终包含一个空字符串 ("")。但是,合适时仍将调用这些验证函数,以确定服务器和客户端的有效性。若要访问进行验证的值,您必须通过编程方式引用所要验证的输入控件,然后从相应的属性中检索该值。例如,若要验证服务器上的 CheckBox 控件,请不要设置验证控件的 ControlToValidate 属性,并将下列代码用于 ServerValidate 事件的处理程序。
void ServerValidation (object source, ServerValidateEventArgs args)
{
args.IsValid = (CheckBox1.Checked == true);
}
示例
下面的代码示例演示如何创建服务器端 CustomValidator 控件。
<%@ Page Language="C#" AutoEventWireup="True" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head>
<title>CustomValidator ServerValidate Example</title>
<script runat="server">
void ValidateBtn_OnClick(object sender, EventArgs e)
{
// Display whether the page passed validation.
if (Page.IsValid)
{
Message.Text = "Page is valid.";
}
else
{
Message.Text = "Page is not valid!";
}
}
void ServerValidation(object source, ServerValidateEventArgs args)
{
try
{
// Test whether the value entered into the text box is even.
int i = int.Parse(args.Value);
args.IsValid = ((i%2) == 0);
}
catch(Exception ex)
{
args.IsValid = false;
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<h3>CustomValidator ServerValidate Example</h3>
<asp:Label id="Message"
Text="Enter an even number:"
Font-Names="Verdana"
Font-Size="10pt"
runat="server"
AssociatedControlID="Text1"/>
<br />
<asp:TextBox id="Text1"
runat="server" />
<asp:CustomValidator id="CustomValidator1"
ControlToValidate="Text1"
Display="Static"
ErrorMessage="Not an even number!"
ForeColor="green"
Font-Names="verdana"
Font-Size="10pt"
OnServerValidate="ServerValidation"
runat="server"/>
<br />
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</form>
</body>
</html>
下面的代码示例演示如何创建客户端 CustomValidator 控件。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void ValidateBtn_OnClick(object sender, EventArgs e)
{
// Display whether the page passed validation.
if (Page.IsValid)
{
Message.Text = "Page is valid.";
}
else
{
Message.Text = "Page is not valid!";
}
}
void ServerValidation(object source, ServerValidateEventArgs args)
{
try
{
// Test whether the value entered into the text box is even.
int i = int.Parse(args.Value);
args.IsValid = ((i % 2) == 0);
}
catch (Exception ex)
{
args.IsValid = false;
}
}
</script>
<html >
<head runat="server">
<title>CustomValidator Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label id="Message"
Text="Enter an even number:"
Font-Size="10pt"
runat="server"
AssociatedControlID="Text1"/>
<br />
<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-Size="10pt"
runat="server"/>
<br />
<asp:Button id="Button1"
Text="Validate"
OnClick="ValidateBtn_OnClick"
runat="server"/>
</div>
</form>
</body>
</html>
<script type="text/javascript">
function ClientValidate(source, clientside_arguments)
{
if (clientside_arguments.Value % 2 == 0 )
{
clientside_arguments.IsValid=true;
}
else {clientside_arguments.IsValid=false};
}
</script>