风影ASP.NET基础教学 5 验证控件(二) 扩展自己的验证控件
前文回顾
我们之前提过了5种官方验证控件的方式。
下面我们来讲解编程方式验证和扩展自己的验证控件
以编程的方式验证asp.net控件
默认情况下,在页面回发到服务器时,页面初始化之后(即视图ViewState和回发数据已处理之后)和调用事件之前,ASPNET验证控件将自动执行验证,如果浏览器支持客户端脚本,控件也可以在浏览器中验证。
但实际开发应用中,上面的情况有可能不能满足你的开发需求,有时候你可能更加需要以编程的方式来进行动态执行验证。如在以下3种情况中,就需要通过编程的方式来进行验证:
1.
验证值在运行时尚未设置,它可能需要在程序运行时根据相关情况动态的进行设置。例如,如果正在使用RangeVlidator验证控件,可能需要根据用户录入的值或者用户的身份在程序执行时动态设置范围控件的最大值与最小值。此时默认验证将不起任何作用,因为当页面调用验证的时候,范围验证控件不能指定其最大值与最小值
2.
需要确定Page_Load事件处理程序中的控件和有效性。在页的处理阶段,验证控件尚未调用,因此页面或单独控件的IsValid属性也未设置。如果试图获取该属性的值,将引发异常。但如果要确定其有效性,则以编程的方式调用。
3.
在运行时编辑控件,其实通过编程方式来进行验证是既方便又灵活的验证技术。同其他服务器控件后台编程一样,只需要在后台代码里设置好验证控件的相关属性就可以。
我们来演示一下第3种方式。
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="TextBox1" EnableClientScript="false"></asp:RangeValidator>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</div>
事件代码:
protected void Button1_Click(object sender, EventArgs e)
{
RangeValidator1.MaximumValue = "50";
RangeValidator1.MinimumValue = "40";
RangeValidator1.Type = ValidationDataType.Integer;
RangeValidator1.Validate();
if(!RangeValidator1.IsValid)
RangeValidator1.ErrorMessage = "必须在40-50之间";
}
结果:
这样我们就可以通过不同的情况来进行不同的验证了。
开发自己的文本验证控件
之前我们提到过BaseValidator类。他是所有验证控件的几类 又是抽象类,它定义了验证控件的基本功能,为所有验证控件提供了核心的实现。因此,可以通过从BaseValidator类中派生一个新的控件类来创建新的验证控件。在使用BaseValidator时,必须注意下面俩个方法:
EvalluateIsValid
当被检验的表单字段通过验证时,该方法返回true,否则返回false。一般情况下,在创建自定义验证控件时,必须重写该方法,并在重写的方法中调用GetControlValidationValue()方法来获取被验证的控件的值。
GetControlValidationValue
该方法用户获取被验证的控件的值。
简单的了解了BaseValidator之后,下面就来通过BaseValidator类创建防SQL注入攻击的文本验证控件。关于这个注入攻击请百度,这里不再赘述。
自定义验证类
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Text.RegularExpressions;
namespace ASPNETTeach3
{
public class StringValidator:BaseValidator
{
private static bool ValidData(string inputData) {
if(Regex.IsMatch(inputData,GetRegexStrings()))
return false;
return true;
}
private static string GetRegexStrings()
{
string[] stringBadChar = {"and","exec","insert","select","delete","update","count","from","drop","asc","char","or","%",";",":","\'","\"","_","chr","mid","master","truncate","declare","SiteName","net user","xp_cmdshell","/add","exec master.dbo.xp_cmdshell","net localgroup administrators"};
string str_Regex = ".*(";
foreach (var item in stringBadChar)
{
str_Regex += item + "|";
}
str_Regex = str_Regex.Substring(0, str_Regex.Length - 1);
str_Regex += ").*";
return str_Regex;
}
protected override bool EvaluateIsValid()
{
string value = this.GetControlValidationValue(this.ControlToValidate);
return ValidData(value);
}
}
}
aspnet页面代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm6.aspx.cs" Inherits="ASPNETTeach3.WebForm6" %>
<%@ Register TagPrefix="myvalid" Namespace="ASPNETTeach3" Assembly="ASPNETTeach3" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<myvalid:StringValidator runat="server" ID="mystr" ControlToValidate="TextBox1" Text="非法字符" />
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>
</html>
结果
当然我们还可以用配置文件完成。
通过配置文件的配置,我们可以不需要在页面里再做配置了,直接使用即可
<configuration>
<system.web>
<pages>
<controls>
<add tagPrefix="myvalid" namespace="ASPNETTeach3" assembly="ASPNETTeach3"/>
</controls>
</pages>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"></modules>
</system.webServer>
</configuration>
我们还可以做成DLL类库
做成类库后我们可以像其他net的动态链接库一样通过设计器来引用。
总结
我们知道了自定义验证的方式。
下次我们讲解用户控件的妙用。