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 页中。

  与服务器端验证类似,使用 arguments 参数的 Value 属性访问要验证的值。通过设置 arguments 参数的 IsValid 属性返回验证结果。

警告   创建客户端验证函数时,请确保同时包括服务器端验证函数的功能。如果创建客户端验证函数时不存在相应的服务器端函数,则恶意代码可能会绕过验证。

  多个验证控件可以同单个输入控件相关联,以验证不同的判据。例如,可将多个验证控件应用于 TextBox 控件,该控件使用户可以输入要添加到购物车中的商品数量。可以使用 CustomValidator 控件确保指定的值小于商品目录中的数量,并使用 RequiredFieldValidator 控件确保用户向 TextBox 控件输入值。

注意   如果输入控件为空,则不调用任何验证函数且验证成功。使用 RequiredFieldValidator 控件防止用户跳过某个输入控件。

  不设置 ControlToValidate 属性也可以使用 CustomValidator 控件。当验证多个输入控件或验证无法与验证控件一起使用的输入控件(如 CheckBox 控件)时,通常这样做。在这种情况下,arguments 参数(该参数传递给 ServerValidate 事件的事件处理程序和客户端验证函数)的 Value 属性总是包含一个空字符串 ("")。但是,仍在适当的位置调用这些验证函数,以确定服务器和客户端上的有效性。若要访问要验证的值,必须以编程方式引用要验证的输入控件,然后从适当的属性中检索该值。例如,若要在服务器上验证 CheckBox 控件,请不要设置验证控件的 ControlToValidate 属性,并且为 ServerValidate 事件的处理程序使用以下代码:

[C#]
void ServerValidation (object source, ServerValidateEventArgs args)
{
args.IsValid = (CheckBox1.Checked == true);
}

有关 CustomValidator 控件的详细信息,请参见 CustomValidator 类。

示例

以下示例说明如何创建一个用于在服务器上验证在文本框中输入的值是否为偶数的 CustomValidation 控件。验证结果随后显示在页上。
<%@ 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" />
      &nbsp;&nbsp;
      <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 控件,该控件执行的验证例程与上例相同,但执行位置是在客户端上。

[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" />
&nbsp;&nbsp;
<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>
ASP.NET 的每个表单验证 Web 控件都有一个共同属性 ControlToValidate。 此属性用于指定该控件所要验证表单项。有了这些基础,我们的自定义验证函数就可以被分解为下列简单任务:
 1. 首先,读取即将被 CustomValidator 控件验证的表单项用户输入值;
2. 然后,执行验证逻辑;
3. 最后,指出该表单项的用户输入是否合法。
  使用前 4 种内建表单验证控件可以完成上述 3 步,操作细节都在后台实现,你也无须进行更多编码工作。然而,我们现在要使用CustomValidator 控件来实现自定义的验证逻辑,所以上述步骤的实现代码还得我们亲自动手完成。首先要做的是书写一个服务端表单验证事件处理程序,它将操纵 CustomValidator 控件完成上述任务。表单验证事件处理程序的定义格式一定要象这样:
                
            CustomValidatorName(sender as Object, args as ServerValidateEventArgs) 

  请注意 CustomValidator 的服务器端表单验证事件处理程序的第二个参数,也就是 args (类型为ServerValidateEventArgs) 。参数 args 拥有两个极其重要的属性:
    1. Value – 代表该 CustomValidator 控件正在验证的表单项用户输入值。
    2. IsValid – 布尔类型,指示本次表单项用户输入值验证的结果。若输入值合法,则你应该把IsValid 设为 true ,否则设为 false 。
         
   最后,你在使用 CustomValidator 控件时,不但要设置 ControlToValidate 属性,还要把OnServerValidate 关联到前述服务器端表单验证事件处理程序上。
posted @ 2006-04-29 14:12  谢多  阅读(1174)  评论(0)    收藏  举报