1. 起因
在商业应用中,很多应用都迁移到B/S架构下,但客户从传统的C/S应用过渡而来,希望尽可能多的保留C/S架构下的操作体验,尤其是一些客户友好的提示及帮助功能。对于输入验证,通常的客户要求包括:
以弹出对话框的方式提示错误信息;
提示错误信息后能将输入焦点聚焦到相应的输入控件;
考虑到系统的性能及用户体验,开发时我们希望能够在页面中尽可能多地完成可以进行的输入验证,避免提交到后台产生的性能问题、流量问题及提交产生的页面刷新(AJAX可以使用局部刷新)。ASP.NET提供了强大的客户端验证机制,但并不能完全满足上面的需求。
2. 扩展方式
自己开发一套独立的客户端验证机制是一件费时费力的工作,鉴于ASP.NET已经提供了一套相对完备的验证机制,因此解决问题的切入点是在现有的ASP.NET验证机制的基础上添加额外的功能。
客户端验证既然在浏览器里实现,必然是由一段客户端脚本来完成的。对应到ASP.NET平台上,客户端验证有一个专用的脚本文件validate.js。对于该文件的链接,由IIS在生成页面时自动根据页面上有没有验证控件来生成的。在ASP.NET 1.1下,该文件包含在IIS的某特定目录下,在ASP.NET 2.0下,该文件通过资源引用的方式包含在页面文件中。脚本如下(中间参数省略):
<script src="/OA2007/ScriptResource.axd?... " type="text/javascript"></script>
在validate.js中,包含了所有客户端验证所需要的脚本,其中验证的总控制流程函数为 Page_ClientValidate(validationGroup),下面为脚本,其中添加的脚本为扩展处理(脚本对应于ASP.NET 2.0,ASP.NET 1.1 处理方式相同)。
view plaincopy to clipboardprint?
function Page_ClientValidate(validationGroup) {
Page_InvalidControlToBeFocused = null;
if (typeof(Page_Validators) == "undefined") {
return true;
}
var i;
for (i = 0; i < Page_Validators.length; i++) {
ValidatorValidate(Page_Validators[i], validationGroup, null);
}
ValidatorUpdateIsValid();
ValidationSummaryOnSubmit(validationGroup);
Page_BlockSubmit = !Page_IsValid;
// added -- start
var errormsg;
var errorcontrol;
errormsg = "";
errorcontrol = "";
if ( ! Page_IsValid ) {
for ( i = 0 ; i < Page_Validators.length ; i++ ) {
if ( ! Page_Validators[i].isvalid ) {
if ( errormsg == "" ) {
errorcontrol = Page_Validators[i].controltovalidate;
errormsg = Page_Validators[i].errormessage ;
} else
errormsg += "\n" + Page_Validators[i].errormessage ;
}
}
}
if ( errorcontrol != "" ) {
alert( errormsg ) ;
eval( "document.all['" + errorcontrol + "'].focus()" )
}
// added -- end
return Page_IsValid;
}
该段脚本遍历验证控件,将所有未通过的错误信息合并起来,弹出提示框,并将焦点聚焦到第一个失败的验证控件上。使用方式如下:
在ASP.NET 1.1环境下,可将脚本文件覆盖IIS目录下的对应文件;
在ASP.NET 2.0环境下,可将脚本文件放在项目目录下,在页面最后声明引用(JavaScript后声明脚本覆盖前声明脚本);如果使用master页面那只需在master页面中声明引用即可;
如果不需要显示验证控件本身,请将验证控件的Display属性设置为None;
上面只是我们根据自己的项目需要所进行的扩展,事实上既然validate.js成为我们完全可以自行控制的脚本,那么进行什么样的扩展将成为你完全的自由。
3. Java中的有趣尝试
在我们的某Java产品中,我们参照ASP.NET的客户端验证机制,通过JSP页面上的自定义标签,结合validate.js脚本,非常方便地实现了一种独立的客户端验证机制(我们不想过份依赖Java下特定平台的特定处理模式,后台验证我们有其他实现机制)。虽然这不是一种正统的JSP验证方式,不过也是一种有趣的尝试。