这篇文章发出来有段时间了,不过看的人不多,建议的人也少! 今天在首页看到有朋友把验证方案发到首页去了,为了赚些评论我也在这边编辑下发到首页上给大家扔些砖!
一、起源
在项目开发中数据有效性验证肯定是必须的,那么在哪里验证呢!?怎么去验证呢? 针对web项目而言,客户端验证+服务端的验证缺一不可,客户端的脚本验证用于提高用户体验! 服务端的验证主要是为了数据的安全性、合法性的验证! 但是我们在实施这两种验证的时候会发现有以下几个可能出现的问题:
1.客户端代码验证写起来相对比较烦琐,而且易出错!(主要是拼写错误,例如js方法名拼写错误)
2. 服务端的验证和客户端验证要保持一致性一样很烦琐。(客户验证输入不能超过10个字符,那后服务器端也要相应的控制在10个字符,而且修改时,需要将客户端和服务端同步修改,提示信息,前后端都要再输入一次!一个字“烦”),总觉得时间不应该花在这个上面!
3.验证与赋值;一般情况下客户端提交的数据,我们验证通过后,把变量的值赋给实体或是相关的变量,如果不通过有些时候我们有时候还会需要给变量或实体属性值加上一个默认值,这个时候我们写的代码可能不避免的出现一些if的判断语句,让代码显得不够简洁。
其它的细节问题,这里就不一一列举了,我针对上面的问题,自己做了一个下面的小组件!
二、 思路说明:
为了解决第一个问题和第二个问题,我决定客户端的验证代码由服务端的验证代码直接生成页面中,这样可以避免客户端的代码在编写上的错误!而服务端的程序代码每次被访问时,通过验证状态开关来开启验证,用户可以根据自己的业务逻辑来开启验证,我先定义了一个验证容器ValidatorContainer和一个验证器Validator两个概念,验证容器是指包括了一个或多个验证器对象的容器类,验证器是针对每一条数据项所添加的验证信息类!
三、调用说明:
可能这一部分的内容可以让你更直观的了解这个验证组件的一些原理和信息:
第一步:先添加引用,这个不用多说,Validator.dll引用进去(最下面附有项目的源码)。
第二步:代码都在下面了,不用再说了
cs页面的代码:
using Validator;
using My.Framework.Utility;
public partial class _Default : System.Web.UI.Page
{
protected ValidatorContainer vc;
protected void Page_Load(object sender, EventArgs e)
{
//是否开启服务端验证
bool isStartCheck = false;
if (Request["command"] == "postBack")
{
/*-------------------------------------------------------------------------------------
* 此处的bool值主要控制验证容器处在何种状态
* 状态false:只注册客户端代码不实施服务端的验证
* 状态true:验证客户端的数据并生成客户端代码字符串
* -------------------------------------------------------------------------------*/
isStartCheck = true;
}
//初始化验证容器的集合,并传入isStartCheck来控制验证的开启
vc = new ValidatorContainer(isStartCheck);
//设置当前的验证组(些处可以根据你自己的页面逻辑来选择验证,不设置为验证所有)
vc.GroupName = "A";
//获取并验证客户端的数据
int month = vc.Add(Validator<int>.Init(MyRequest.GetInt("monthTextBox",0)))//注意这一行,我们需要把验证器放置到对应的容器中再进行验证
.Integer("月份必须为1到12的整数")
.Range(1,12,"月份必须在1到12月之间")//验证数字和范围
.SetGroupName("A")//设置其所属的验证组,可以不设置(不设置会被分配到default组)
.RegClientValidator("monthTextBox", "请输入出生月", "monthErrorSpan")//将验证代码注册到客户端页面(也可以选择不注册)。
//参数说明,参数1:"monthTextBox"表示html控件的id,[参数2]:"请输入出生月"表示提示Div中的文字(该参数为重载),[参数3]:"monthErrorSpan"表示错误信息所显示的框(该参数为重载)
.Retrun(1);//返回验证通过后的值,否则返回默认值(此处返回的是1);
string userName = vc.Add(Validator<string>.Init(MyRequest.GetString("userNameTextBox")))
.Chinese("用户名必须为中文!")
.Length(4,16,"用户名必须在2到8个字以内!")
.SetGroupName("A")
.RegClientValidator("userNameTextBox")
.Retrun("给你个默认值");
string rePostDateString = vc.Add(Validator<string>.Init(MyRequest.GetString("rePostDateTextBox")))
.Date("日期格式不正确")
.Range(DateTime.Now, DateTime.MaxValue, "重发日期不能少于当前日期!")//这个功能客户端的还没写
.SetGroupName("A")
.IsRequired(false)//设置其为非必填项
.RegClientValidator("rePostDateTextBox","这个是非必填项,当然你如果要填的话,我肯定是要验证的啦!")
.Retrun("2009-12-12");
//注册客户端代码到页面中,这里必须要声明运行于服务端的Header或是Form才能进行注册
vc.RenderClinetValidator();
//判断验证是否通过
if (isStartCheck)
{
if (vc.IsAllPass)
{
//你页面要做的逻辑
}
}
}
}
aspx页面的调用代码:
<head>
<!--这里加runat="server"或是如现在的页面有一个 <form id="form1" runat="server">是runat='server'的-->
<title>验证器测试页</title>
</head>
<body style="padding-top:50px; background-color:Black">
<form id="form1" runat="server">
<div>
<br />
请输入出生月份:<input type="text" id="monthTextBox" value="aa" /><span id="monthErrorSpan" style=" background-color:Red">这里将用来显示验证反馈信息</span><br />
请输入用户昵称:<input type="text" id="userNameTextBox" value="aa" /><br />
更新日期:<input type="text" id="rePostDateTextBox" value="aa" /><br />
<input type="button" id="" value="统一验证" onclick="<%=vc.Checked("A")%>" />
<!--上面这个地方就是调用的地方,"<%=vc.Checked("A")%>"会产生一个js调用函数,