风影ASP.NET基础教学 4 验证控件
前言
无论什么应用软件系统,它最本质的功能和用途就是处理数据。这样,数据的安全性就成为了系统设计里面非常重要的话题,提交一些不安全的数据(如SQL注入、数据类型或者数据范围不合适等)常常会导致系统计算结果不正确,瘫痪甚至崩溃!
因此,这就要求在设计系统数据录入与提交功能时必须对数据的合法性进行验证,以保证干净准确的数据流入系统。
有过web开发经验的人都知道,以前对于数据输入的合法性验证用得最多的就是JS的脚本验证。这种方法就是当用户通过网页表单域输入数据后,再通过JS脚本对其有效性进行检验,如果输入的有问题就会终止提交数据操作。这种验证方式不占用服务器资源,可以很好的保证其性能。但是一旦用户禁用了浏览器的JS脚本。或者对于一个精通此道的攻击者来说,这些手段就显得不堪一击了(我可以伪造一个页面只有表单域而没有JS验证脚本、通过高科技(firebug)轻松搞定)。
面对这样的状况,大部分开发者开始选用了服务器端验证的方式。虽然服务器端验证方法对于js脚本来说安全性更高,但会让你写很多验证的代码。不论代码量还是服务器的资源消耗上来说,过多的验证逻辑都不是很理想的,因此ASPNET中页面的数据录入控件里。当验证控件和输入控件进行绑定之后,验证控件将自动执行客户端和服务器的双重验证,而我们所做的就是在验证空间里设置好数据验证的规则,以及相关的提示信息。如果相应的页面输入的数据为空、类型不正确或者不遵循验证规则,那么验证控件将完全终止页面回发,并返回相应的验证提示
验证控件的类型
在ASP.NET中,一共提供了6种验证控件,例如范围检查、模式匹配等验证控件。
RequiredFieldValidator | 非空验证 |
RangeValidataor | 用户检查用户录入数据是否在指定的范围内,你可以使用它来检查数字、字母、日期的范围 |
CompareValidataor | 可用于检查与其他控件的特定类型数据的比较(大于,小于,等于) |
RegularExpressionValidataor | 正则表达式验证 |
CustomValidataor | 自定义验证 |
ValidationSummary | 本身没有验证效果,但是经常和验证控件一起使用,用于显示来自网页上所有验证控件的错误信息 |
当然并非只能一个控件只能有一种验证,一个控件可以被多个验证控件来验证的。比如一个文本框既可以验证非空,同时还可以进行正则验证。
BaseValidator
BaseValidator是所有验证类的基类,该类为所有验证控件提供和核心实现,它的常用属性与方法
ControlToValidate | 验证控件将计算的输入控件的编程ID,如果此为非法ID则引发异常 |
Display | None:验证控件从不内联显示,如果希望在ValidationSummary控件中显示错误,则可以使用此项 Static:如果验证失败则显示错误信息,即使通过的验证则也会占用显示空间。 Dynamic: 如果验证失败则显示错误信息,通过验证则不会占用显示空间 |
EnableClientScript | 指示是否启用客户端验证,通过将此属性设置为false可以禁用js验证。 |
Enable | 指示是否启用控件 若为flase则禁用验证效果 |
ErrorMessage | 验证错误时显示的文本 它允许录入html信息 也就是说我们可以写一个img标记 |
ForeColor | 验证错误时显示的文本颜色 |
IsValid | 被验证的控件是否通过验证 |
FocusOnError | 当验证错误时,让出错的控件获取焦点 |
ValidationGroup | 指定该验证控件的验证组 |
Validate() | 执行验证操作并更新IsValid属性 |
Text | 在页面中显示的错误信息若没有指定的显示ErrorMessage信息 |
验证流程
在ASP.NET中有许多能够回发到服务器的数据提交控件,如BulletedList,Button,CheckBox,CheckBoxList,HtmlButton,HtmlInputButton,HtmlInputImage,ImageButton,LinkButton,ListBox,RadioButtonlist和TextBox控件。这些按钮都有一个CausesValidation属性
CausesValidation=false
ASPNET会忽略验证控件,页面正常被回送,事件处理代码正常执行
CausesValidation=true
ASPNET会执行所有验证控件,通过验证时才会被回发数据请求。
忽略前
忽略后
值得注意的是,有些控件的的AutoPostBack属性设置为true时才可以回发到服务器。
这些控件都有一个ValidationGroup属性,设置此属性后,当控件触发服务器回发时,仅验证指定组中的验证控件。
分组后同组的回传控件会触发同组的事件
RequiredFieldValidator
1: <asp:TextBox ID="TextBox1" runat="server" ValidationGroup="a"></asp:TextBox>
2: <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" Display="Dynamic" ErrorMessage="账号不允许为空" ForeColor="Red"></asp:RequiredFieldValidator>
RangeValidator
它可以用来验证用户输入的数据是否在指定的范围内
Type属性
String | 指定字符串数据类型 |
Integer | 指定为整数类型 |
Double | 指定为双精度浮点类型 |
Date | 指定为日期数据类型 |
Currency | 指定货币类型 |
注意:范围控件不会验证非空错误,所以我们喜欢这两个控件搭配使用。防止用户跳过某个控件的输入。
<asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="<img src='a.jpg' width='20px'>" MaximumValue="20" MinimumValue="1" Type="Integer"></asp:RangeValidator>
CompareValidator
比较控件需要至少1个录入数据的控件才可以正常验证数据。
我们会用到一个比较属性Operator
和一个常数比较
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="必须大于20" ValueToCompare="20" Type="Integer" ControlToValidate="TextBox1" Operator="Equal"></asp:CompareValidator>
<asp:Button ID="Button1" runat="server" Text="Button" />
和其他控件的比较
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="两个控件数据必须一致" ControlToValidate="TextBox2" ControlToCompare="TextBox1" Operator="Equal"></asp:CompareValidator>
正则验证控件 RegularExpressionValidator
只需要指定要验证的正则表达式即可 。最常用的验证
自定义验证控件 CustomValidator
一般情况下,我们用上述的验证控件足够我们处理常见的数据验证问题了,如果确实需要一些自定义的验证方式。就可以采用CustomValidator了。
自定义验证控件允许根据自己的需要来分别定义客户端和服务器端验证子程序。然后与验证控件关联起来即可。
客户端验证方法
<head runat="server">
<title></title>
<script type="text/javascript">
function validation1(source, arg) {
if (arg.Value % 2 == 0)
arg.IsValid = true;
else
arg.IsValid = false;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="不能被2整除" ClientValidationFunction="validation1" ControlToValidate="TextBox1"></asp:CustomValidator>
验证效果
同样我们可以创建服务器端验证方法
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
try
{
args.IsValid = int.Parse(args.Value) % 2 == 0;
}
catch (Exception)
{
args.IsValid = false;
//throw;
}
}
我们只需要创建服务器端验证事件即可
Page.IsValid
注意如果想在PageLoad里判断是否通过了验证,则我们需要显示的调用Page.Validate()方法才可以通过Page.IsValid属性判断是否通过验证。
如果我们只想在类似click事件里知道是否通过的话,我们不需要显示调用Page.Validate()方法。
通过Aspnet页面生命周期可以知道,验证是在Load事件之后,用户自定义事件之前发生。
总结
我们讲解了关于ASPNET中的5种常用的验证控件。
下一篇我们来讲解自定义验证控件。