[asp.net] 验证控件

本文介绍了ASP.NET中的验证控件,包括RequiredFieldValidator、RangeValidator、CompareValidator、RegularExpressionValidator和CustomValidator。详细讲解了各个控件的用途、属性及应用场景,并提供了实例代码,如检查字段必填、值范围、数据类型、正则表达式匹配以及自定义验证。此外,还讨论了如何使用Validator的IsValid属性、Display属性以及验证组,以及如何利用ValidationSummary控件汇总错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.aspx
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="此用户名已注册过" ControlToValidate = "txtName" OnServerValidate ="ValidateName"> 
</asp:CustomValidator> 

,aspx.cs

public void ValidateName(Object sender, ServerValidateEventArgs args) 
{ 
SqlConnection myConn = new SqlConnection("Data Source=(local);Initial Catalog=Csharp;Integrated Security=True"); 
myConn.Open(); 
SqlCommand myCmd = new SqlCommand("select use_account from users", myConn); 
SqlDataAdapter myDa = new SqlDataAdapter(myCmd); 
DataSet myDs = new DataSet(); 
myDa.Fill(myDs); 
for (int i = 0; i < myDs.Tables[0].Rows.Count; i++) 
{ 
if (args.Value.ToString() == myDs.Tables[0].Rows[i][0].ToString()) 
{ 
args.IsValid = false; 
break; 
} 
else 
{ 
args.IsValid = true; 
} 
} 
} 

通过自定义服务器端的函数代码,与前台验证控件关联,形成一种假客户端—当前页面验证的效果。 
以上面前台验证控件这段代码为例: 
ErrorMessage属性表示当验证不合法时,出现错误的信息; 
ControlToValidate属性表示需验证的控件ID; 

OnServerValidate属性表示与自定义函数相关联,以在服务器上执行验证; 


ASP.Net提供了如下的验证控件:

RequiredFieldValidator:字段必填。

RangeValidator:值在给定的最大值、最小值之间;

CompareValidator:用于比较两个值的关系是否满足要求或者是否是指定类型的数据;

RegularExpressionValidator:校验数据满足正则表达式;

CustomValidator:自定义验证。

 

RequiredFieldValidator

ControlToValidate设定要验证的控件,Text设置为当被验证的控件属性为空的时候显示的错误信息,Text不仅可以写普通文本,还可以写任何HTML内容。也可以使用ErrorMessage设置发送错误的时候显示的消息。

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"

ControlToValidate="TextBox1" ErrorMessage="不能为空"></asp:RequiredFieldValidator>

有时候控件如果是默认值也认为是空值,比如下拉列表的选中值为”--选中性别--”,文本框的值为”填入搜索关键字”,只要将RequiredFieldValidator的InitialValue属性设置为” --选中性别--”、” 填入搜索关键字”就可以了。

<asp:TextBox ID="TextBox1" runat="server">请输入关键词</asp:TextBox>

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"

ControlToValidate="TextBox1" ErrorMessage="不能为空"

InitialValue="请输入关键词”></asp:RequiredFieldValidator>

 

Validator共性

页面中的IsValid属性用来判断页面中的所有Validator是否校验通过,只有都校验通过才为True,即使页面中的Validator服务端校验报错(禁用javascript就可以跳过客户端校验),在服务端方法中的业务代码(比如btn1_Click)也会被执行,因此如果代码在数据校验不通过的不能执行则需要判断IsValid的值。

        protected void Button1_Click(object sender, EventArgs e)

        {

            if (this.IsValid)

            {

                //防止跳过客户端校验。因为如果跳过客户端校验,哪怕服务端没有校验过,Button_Click方法也会被调用。IsValid表示页面中所有Validator是否都通过了。

            }

        }

 

所有验证控件都有Display属性,用来决定如何显示错误信息。三个值:Static:没有错误信息的时候控件的visiblity样式为hidden来实现隐藏;Dynamic:没有错误信息的时候控件display样式为none来实现隐藏。

这两者的区别是display:none和visibility:hidden隐藏的区别是, visibility:hidden隐藏控件仍然会占据空间,而display:none隐藏则不会占空间。display属性还可以设置为none(用来配合后面讲的ValidationSummary)

    你?好?<span style="display:none">你看不见我</span>?

    <br/>

你?好?<span style="visibility:hidden">你看不见我</span>?

 

几乎所有控件都有ControlToValidate、Text属性,不再额外说,所有验证控件都几乎在客户端和服务器端都要进行校验。

 

如果在一个页面中同时防止注册和登录表单,那么他们的验证就会同时进行,这样虽然只是登录,但是注册的验证也会触发,可以使用验证组来解决这个问题,将同一组的控件(表单,提交按钮等)的ValidationGroup设为相同的值就可以,这样的话,和Button等触发事件的控件的ValidationGroup相同的控件才会校验。

 

如果将按钮控件(Button、ImageButton、LinkButton)的CausesValidation属性设置为false,则这个按钮的点击不触发校验。为了区别一些跟校验按钮没有关系的一些按钮,这样其他跟表单没有关系的按钮还可以执行相应的操作,不需要校验表单中的数据。

 

 

 

26验证控件2

RangeValidator

RangeValidator控件的属性:MinimumValue属性、MaximumValue属性为最大、最小值,Type属性为数据类型(stirng 、integer、double、data、currency(货币)等)。例子:年龄,毕业日期在合理的范围内。

RangeValidator、CompareValidator、RegularExpressionValidator等都不会对非空值进行校验,所以如果字段不允许为空则需要再使用RequiredFieldValidator控件。同时设置几个校验的时候,可以通过设置校验控件的Display属性设置是否占位置。

 

CompareValidator

CompareValidator的属性:Type属性同RangeValidator。Operator属性,比较操作符,可选值DataTypeCheck(数据类型)、Equal(=)、GreaterThan(>)、GreaterThanEqual(>=)、LessThan(<)、LessThanEqual(<=)、 NotEqual(!=)。ValueToCompare属性,所比较的运算符右边的值。ControlToCompare属性,设定与另外一个控件的值进行比较。

校验数据类型,需要修改:ControlToValidate设定要校验的控件,Type设定要校验的数据类型,Operator设定为DataTypeCheck。

要进行范围比较,需要设定, ControlToValidate设定要校验的控件,Type设定要校验的数据类型,Operator设定为比较的运算符,ValueToCompare设定要比较的值。

与另外一个控件的值进行比较, 需要设定, ControlToValidate设定要校验的控件,Type设定要校验的数据类型,Operator设定为比较的运算符,ControlToCompare设置为要比较的控件(运算符右边的控件)

练习:转正日期不能大于入职日期。

    <form id="form1" runat="server">

    入职日期:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

    转正日期:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

    <asp:CompareValidator ID="CompareValidator1" runat="server"

        ControlToCompare="TextBox1" ControlToValidate="TextBox2"

        ErrorMessage="转正日期不能小于入职日期" Operator="GreaterThanEqual" Type="Date"></asp:CompareValidator>

    <br />

    <asp:Button ID="Button1" runat="server" Text="Button" />

    </form>

 

高级Validator

RegularExpressionValidator:ValidationExpression属性为设定一个正则表达式,VS的可视化编辑提供了几个内置的正则表达式,也可以自己写。案例,校验Email地址,身份证号码,QQ号码(5位至10位的数字),个人署名必须在10到50字之间。

 

CustomValidator,自定义验证控件。当ASP.Net内置的验证控件无法满足要求的时候可以使用CustomValidator。

onservervalidate事件为服务端的校验函数,在事件处理函数中读取args.Value来获得校验的值,如果值合法则将args.IsValid设置为true,否则设置为false。如果为ClientValidationFunction设定一个客户端函数名,那么会首先在客户端调用指定的javascript函数进行客户端校验,否则将只做服务端校验。客户端校验函数的签名为”函数名(src,args)”,args的属性以及意义和服务端的一样。

练习:自定义校验,试文本框中输入的值必须为1,在服务端和客户端分别校验。

.aspx:

<head runat="server">

    <title></title>

    <script type="text/javascript">

        function OnlyOne(src, args) {    //客户端函数的必须格式。

            if (args.Value == "1") {

                args.IsValid = true;

            }

            else {

                args.IsValid = false;

            }

        }

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <p>

        必须为1:<asp:TextBox ID="txtOnlyOne" runat="server"></asp:TextBox>

        <asp:CustomValidator ID="CustomValidator1" runat="server"

            ControlToValidate="txtOnlyOne" ErrorMessage="必须为1"

            onservervalidate="CustomValidator1_ServerValidate"

            ClientValidationFunction="OnlyOne"></asp:CustomValidator>

    </p>

    <p>

        <asp:Button ID="Button1" runat="server" Text="Button" />

    </p>

    </form>

</body>

.aspx.cs:

        protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)

        {

            if (args.Value == "1")

            {

                args.IsValid = true;

            }

            else

            {

                args.IsValid = false;

            }

        }

 

 

 

27验证控件练习点评

练习:根据月份显示天数。

客户端:

<head runat="server">

    <title></title>

    <script type="text/javascript">

        function dayValidate(src, args) {

            var txtMonth = document.getElementByIdx_x("<%=txtMonth.ClientID %>");

            var month = parseInt(txtMonth.value, 10);

            var day = parseInt(args.value, 10);

            var date={ 31, 29, 31, 30,31, 30, 31, 31, 30, 31, 30 };

            var days=data[month-1];

            args.IsVaild=(day>=1&&day<=days);

        }

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <p>

        月份:<asp:TextBox ID="txtMonth" runat="server"></asp:TextBox>

        <asp:RangeValidator ID="RangeValidator1" runat="server"

            ControlToValidate="txtMonth" ErrorMessage="必须在1-12之间" MaximumValue="12"

            MinimumValue="1" Type="Integer"></asp:RangeValidator>

    </p>

    <p>

        日期:<asp:TextBox ID="txtDay" runat="server"></asp:TextBox>

        <asp:CustomValidator ID="CtvDay" runat="server" ControlToValidate="txtDay"

            ErrorMessage="日期错误" onservervalidate="CtvDay_ServerValidate"

            ClientValidationFunction="dayValidate"></asp:CustomValidator>

    </p>

    <p>

        <asp:Button ID="Button1" runat="server" Text="Button" />

    </p>

    </form>

</body>

服务端:

        protected void CtvDay_ServerValidate(object source, ServerValidateEventArgs args)

        {

            int month = Convert.ToInt32(txtMonth.Text);

            int day = Convert.ToInt32(args.Value);

            int[] data = new int[] { 31, 29,31, 30, 31, 30, 31, 31, 30, 31, 30 };

            int days = data[month - 1];

            args.IsValid = (day >= 1 && day <= days);

        }

 

 

 

28验证消息汇总

使用Validator错误消息会显示在放置的位置,这样有两个可能的问题:如果表单非常大,用户看不到全部的错误消息,希望把错误消息几种显示在提交按钮旁边;如果错误信息非常多且会散落各地,希望能集中显示。

ValidationSummary控件用来集中显示错误消息。每个验证控件都有ErrorMessage、Text两个属性,ErrorMessage是用来显示到ValidatorSummary中的值,Text是用来显示到Validator位置的值,如果Text为空,则ErrorMessage会同时显示到ValidationSummary和控件的位置,能知道指的是那个控件:ErrorMessage要详细一些(比如”用户名不能为空”,不能是”不能为空”等),这样才能从ValidationSummary每条错误信息中读取值出来。

ValidationSummary的属性:DiaplayMode,显示模式:ShowMessageBox,用户同时显示错误对话框。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值