当前位置导航:炫浪网>>网络学院>>编程开发>>Visual C#教程

扩展 ASP.NET 的客户端验证

        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验证方式,不过也是一种有趣的尝试。

相关内容
赞助商链接