日期:2012-05-10  浏览次数:20886 次

在论坛上看到有关CustomValidator控件验证控件值为空的问题http://community.csdn.net/Expert/topic/3772/3772658.xml?temp=.9461634,正好我也遇到过,解决方法就是不要指定CustomValidator 控件的ControlToValidate,这样在提交的时候回进行验证
,代码如下:
<%@ Page Language="C#" AutoEventWireup="True" %>

<html>
<head>
</head>
<body>

<form runat="server" id="Form1" >
<asp:TextBox id="Text1"
runat="server" />

<asp:CustomValidator id="CustomValidator1"
ClientValidationFunction="ClientValidate"
Display="Static"
ErrorMessage="不能为空!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<br/>
<asp:Button id="Button1"
Text="Validate"
runat="server"/>
</form>

</body>
</html>

<script language="javascript">
<!--
function ClientValidate(sender, args)
{
if(Form1.Text1.value.length<=0)
{
args.IsValid = false;
}else{
args.IsValid = true;
}
}
// -->
</script>

问题分析:
与所有其它验证控件类似(RequiredFieldValidator 除外),如果输入字段为空,则认为 CustomValidator 有效。所以造成CustomValidator没有办法验证空值, 让ControlToValidate 为空,客户端函数每次尝试提交时总会触发一次,这样就可以实现在提交时验证控件为空
以下信息摘自MSDN:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfSystemWebUIWebControlsCustomValidatorClassTopic.asp


注意 如果输入控件为空,则不会调用任何验证函数,并且验证将成功。使用 RequiredFieldValidator 控件要求用户在输入控件中输入数据。
可以在不设置 ControlToValidate 属性的情况下使用 CustomValidator 控件。这种情况通常出现在验证多个输入控件或是验证无法与验证控件一起使用的输入控件(如 CheckBox 控件)时。这种情况下,传递给 ServerValidate 事件的事件处理程序及客户端验证函数的 arguments 参数的 Value 属性将始终包含一个空字符串 ("")。但是,合适时仍将调用这些验证函数,以确定服务器和客户端的有效性。若要访问进行验证的值,您必须通过编程方式引用所要验证的输入控件,然后从相应的属性中检索该值。例如,若要验证服务器上的 CheckBox 控件,请不要设置验证控件的 ControlToValidate 属性,并将下列代码用于 ServerValidate 事件的处理程序。


用途:
您可能会说既然不为空,干嘛不用RequiredFieldValidator,当然是有原因的,比如我有个复选框,我想实现只有选择这个复选框的时候才要求某个文本框不为空,这样我就可以用下面的代码了:
<%@ Page Language="C#" AutoEventWireup="True" %>

<html>
<head>
</head>
<body>

<form runat="server" id="Form1" >
<asp:CheckBox id="CheckBox1" runat="server"></asp:CheckBox>
<asp:TextBox id="Text1"
runat="server" />

<asp:CustomValidator id="CustomValidator1"
ClientValidationFunction="ClientValidate"
Display="Static"
ErrorMessage="不能为空!"
ForeColor="green"
Font-Name="verdana"
Font-Size="10pt"
runat="server"/>
<br/>
<asp:Button id="Button1"
Text="Validate"
runat="server"/>
</form>

</body>
</html>

<script language="javascript">
<!--
function ClientValidate(sender, args)
{
if(Form1.CheckBox1.checked&&Form1.Text1.value.length<=0)
{
args.IsValid = false;
}else{
args.IsValid = true;
}
}
// -->
</script>