数据验证控件是asp.net中专门用来验证表单用户输入的控件。比如,requiredfieldvalidation就是一个专门用来验证用户是否已经输入的控件,使用这个控件,可以保证用户一定输入了表单的某个表单项(比如数据输入框)。另外,asp.net还专门提供了以下数据验证控件:
1. requiredfieldvalidator:检查用户是否输入;
2. comparevalidator:检查两个表单输入项的输入信息是否存在某种指定关系,比如大、等于等;
3. rangevalidator:检查用户输入是否在某一指定范围;
4. regularexpressionvalidator:检查用户输入是否符合某一指定的正则表达式要求;
5. customvalidator: 检查用户输入是否符合开发者指定的验证逻辑规则。
本文的目的不是在于讨论以上所有控件的用法,如果希望了解其他控件,可以参看:
http://samples.gotdotnet.com /quickstart /aspplus/doc /webvalidation.aspx。
customvalidator控件概述
简单地使用前面提到的前四个数据验证控件,就可以实现我们一般开发的大部分数据表单的验证要求。然而,有时候我们需要验证一些比较复杂的表单。想像一下,我们有一个比较复杂的调查表,该调查表包含一个有很多单选按钮和多选按钮的表单,一些多选按钮和个人的爱好相对应,比如游泳、体育、阅读等,调查表希望被调查人选择自己的所有爱好。在这些选项下面,提示如下文字:“如果你提示有体育和游泳两种爱好,请选择您什么时候开始学习游泳”,在这些文字下方放置一些标识年龄段的单选按钮,这些按钮是否有效取决于我们在前面提到的多选按钮的选择情况。在以上的验证情况中,我们就要使用到customvalidator数据验证控件。
在所有的asp.net数据验证控件中,都有一个“controltovalidate”的控件属性需要设置,这个属性用来指定表单中需要验证的表单项。在customvalidator数据验证控件中,需要做以下事情:
1. 读取需要customvalidator验证的表单项值;
2. 执行验证操作;
3. 决定被验证表单项是否符合验证要求。
在其他内建控件中,以上步骤用户是不知道也不要理睬的,但是,在使用customvalidator的时候,我们需要自己动手实现以上步骤。为了实现以上步骤,我们需要编写一个服务器端数据验证函数,该函数的样式如下:
sub functionname(sender as object, args as servervalidateeventargs)
……
end sub
注意以上函数的args参数,它是functionname函数的第二个参数,这个参数有以下两个属性:
1. value:被验证数据表单的值。
2. isvalid:验证是否通过。如果通过,isvalid的值是true; 如果没有通过,其值为false。
在使用customvalidator的时候,我们不但要设置“controltovalidate”属性,我们还必须设置onservervalidate事件来处理服务器端的数据验证动作。
建立一个简单的
customvalidator控件
假设现在建立一个与数学有关的网站,在这个网站,我们要求浏览者提供自己喜欢的质数,以此来提高我们网站的访问量。在asp.net中,没有一个现成的可以专门验证质数的服务器端数据验证控件,这样,我们就有必要用到customvalidator控件。
以下例子用来验证用户输入的数是不是质数。在这个表单中,有一个用户输入数据的textbox控件和一个button控件,还有用于验证是不是质数的customvalidator控件,和两个用于保证用户输入为正数的comparevalidator控件。
< script language=“vb” runat=“server” >sub btnsubmit_click(sender as object, e as eventargs)if page.isvalid then response.write(“< font color=““red””> < i>”& txtprimenumber.text & “is, indeed, a good prime number. < /i>< /font>”)else response.write(“< font color=““red””>< i>” & txtprimenumber.text & “is < b>not< /b> a prime number.< /i>< /font>”) end if end sub sub primenumbercheck(sender as object, args as servervalidateeventargs) dim iprime as integer = cint(args.value),iloop as integer, isqrt as integer = cint(math.sqrt(iprime)) for iloop = 2 to isqrt if iprime mod iloop = 0 then args.isvalid = false exit sub end if next args.isvalid = true end sub< /script>< form method=“post” runat=“server”> enter your favorite prime number:< asp:textbox id=“txtprimenumber” runat=“server” />< %-- 建立customvalidator 控件 --%> < asp:customvalidator runat=“server” id=“custprimecheck” controltovalidate=“txtprimenumber” onservervalidate=“primenumbercheck” errormessage=“invalid prime number”/>< %-- 建立两个comparevalidator控件:第一个保证输入为数字;第二个保证输入为正数 --%> < asp:comparevalidator runat=“server” id=“compprimenumber”operator=“datatypecheck” type=“integer” display=“dynamic” controltovalidate= “txtprimenumber”errormessage = “you must enter an integer value.”/> < asp:comparevalidator runat=“server” id=“compprimenumberpositive”operator=“greaterthan” type=“integer” display=“dynamic” valuetocompare=“0” controltovalidate=“txtprimenumber” errormessage =“you must enter a value greater than zero.”/> < p>< asp:button id=“btnsubmit” runat= “server”onclick=“btnsubmit_click” text=“submit” />< /form>
如果对判定质数不是太熟悉,可能对于以上的primenumbercheck事件处理感觉比较迷惑。首先,将用户在txtprimenumber输入的数据通过事件的args.value传送给txtprimenumber,然后,将用户的输入开平方根,再将用户输入的数字除以从2到刚才算出的平方根之间的每一个数字。如果出现结果为零的情况,说明用户输入的数字不是质数,设置args.isvalid为false; 如果全部为零,说明用户输入合法,设置args.isvalid为true。
客户端验证
asp.net内建数据验证控件的一大特点就是它们的所有验证都是在客户端进行的,不需经过服务器端,而customvalidator控件的错误验证完全是通过服务器端实现的。必须意识到的一点是,不管是否通过客户端实现数据验证,服务器端的数据验证是一定会产生的。增加客户端验证的功能,只是让我们的数据验证控件更加友好。
为了实现客户端验证的功能,我们必须使用javascript或者vbscript写一个脚本函数,因为vbscript只支持ie浏览器,因此,这里我们采用javascript来编写这个函数:
< script language=“javascript” >< !-- function checkprime(sender, args) { var iprime = parseint(args.value); var isqrt = parseint(math.sqrt(iprime)); for (var iloop=2; iloop< =isqrt; iloop++) if (iprime % iloop == 0) { args.isvalid = false; return; } args.isvalid = true; }// -->< /script >
在这个例子里面,我们输入数字6,然后按“tab”按钮。在高版本的浏览器里面,我们将看到来自customvalidator控件的错误信息,这样,我们的customvalidator控件也就有了客户端验证功能。在以上代码中,可能已经注意到我们并没有定义数据sender和args的类型,因为在脚本语言中,是没有严格的数据类型定义的。
为了实现客户端数据验证,惟一要做的就是在customvalidator控件定义中加入以下语句:clientvalidationfunction=“checkprime”,这里,其实就是指定自定义验证控件的客户端验证函数。在这个例子里,前面定义的“checkprime”函数就是客户端验证函数。
总结
上面我们介绍了asp.net中几乎是功能最灵活的数据验证控件customvalidator的使用,介绍了customvalidator控件的服务器端验证和客户端验证的实现。尽管在实际的开发工作中,可能我们使用asp.net的内置数据验证控件几乎完全可以满足我们的开发要求,但是若能了解customvalidator控件的使用和特点将会更有利于解决在工作中碰到的数据验证问题。
新闻热点
疑难解答
图片精选