• 利用JavaScript手动触发ASP.Net validator验证控件的方法


    开发环境:.NET Framework 3.5.1 sp1

    参考文章http://www.codeproject.com/KB/aspnet/JavascriptValidation.aspx

    http://msdn.microsoft.com/zh-cn/library/aa479045.aspx

    http://www.cnblogs.com/minsentinel/archive/2008/03/21/1116502.html

      我们在用Web Form开发的的时候,有时候可能需要在客户端用JavaScript来触发Validator验证控件的验证来检查输入的正确性。

       比如有个在弹出窗口中预览编辑中的内容的功能,在预览之前需要对编辑中的内容进行输入检查。如果输入检查是通过Validator控件的客户端验证来实现的,

       这里就涉及到怎样在不进行submit的情况下用JavaScript来触发Validator验证。

         我们知道在通过aspx生成的html代码中,会有很多框架自动添加的内嵌资源(web source)文件引用和代码。对于Validator控件的验证代码就藏在其中。

    从页面的源文件中下载WebResource.axd这个文件可以看到js验证的源码.

    操作:用IE打开网页,保存网页,选择保存类型为"网页,全部"

    image

    就可以看到保存下来的文件:

    image 这两个差不多就是验证的所有源码了.

       通过Debug跟踪有幸找到了源代码,发现起关键作用的是以下2个JavaScript方法:

    1 Page_ClientValidate(validationGroup)
    返回值是布尔值(true:验证通过, false:验证失败)。

    2 ValidatorValidate(val, validationGroup, event)
    无返回值,无法判断验证是否通过。调用Validator的验证并更新其表示形式以及验证失败时聚焦控件等

       其实在Page_ClientValidate里会调用ValidatorValidate来调用Validator的验证和并根据display属性的值(None, Static, Dynamic)来调整Validator的表示形式。

    一, Page_ClientValidate方法

            参数为ValidationGroup属性的值。没有指定参数的情况下表示触发页面所有的Validator控件。

    <script type="text/javascript">
    function preview() {
          // 输入验证
    if (!Page_ClientValidate("Detail")) {
    return;
    }

    // 验证成功后的处理
          ......
    }
    </script>

       如果没有使用ValidationSummary控件,而且不关心验证成功与否的后续处理。那可以使用ValidatorValidate方法

    ***

    问题:

    一.同时验证全部验证组:

    a)客户端解决

    1.

    val res1=Page_ClientValidate("Detail") ;

    val res2=Page_ClientValidate("BBB");

    2.

    if (!Page_ClientValidate("Detail") || !Page_ClientValidate("BBB")) {
    return;
    }

    以上两种写法,只有当Detail验证通过的时候,才会进行验证BBB,没有办法页面上同时进行验证两个及以上.

    可以用Page_ClientValidate()来验证多个验证组的.

    if (!Page_ClientValidate()) {
          return;
    }


    Page_ClientValidate说明:

    Page_ClientValidate():验证所有的控件(有设置验证组和没有验证组的都进行验证).

    Page_ClientValidate(""):验证没有设置验证组的控件.

    Page_ClientValidate("PP"):验证验证组为PP的控件.

    b)服务器端解决

    Page.Validate();//验证所有的控件

    if (!Page.IsValid)
    {
                     return;
    }

    Page.Validate说明:

    Page.Validate():验证所有的控件(有设置验证组和没有验证组的都进行验证).

    Page.Validate(""):验证没有设置验证组的控件.

    Page.Validate("PP"):验证验证组为PP的控件.

    二.验证自定义的验证组.

    (参考 http://blog.163.com/xiao_mege/blog/static/729427532010112845924555/ )

    添加两个JS function:

    function ValidatePage(validationGroups)

    {

    var list = validationGroups.split('&');

    for (var i = 0; i < Page_Validators.length; i++)

        {

                 var validator = Page_Validators[i];

    if ((validator.validationGroup && ExistsGroup(list, validator.validationGroup))

                || (!validator.validationGroup && ExistsGroup(list, '')))

            {

                ValidatorValidate(validator, validator.validationGroup);

                Page_IsValid = Page_IsValid && validator.isvalid;

            }

    else

            {

                validator.isvalid = true;

                ValidatorUpdateDisplay(validator);

            }

        }

    //ValidationSummary

    for (var i = 0; i < list.length; i++)

        {

            ValidationSummaryOnSubmit(list[i]);

        }

        Page_BlockSubmit = !Page_IsValid;

        return Page_IsValid;

    }

    function ExistsGroup(list, group)

    {

    var found = false;

    for (i = 0; i < list.length; i++)

        {

    if (list[i] == group)

            {

                found = true;

                break;

            }

        }

         return found;

    }

    调用:

    <asp:Button ID="ibtnSave" runat="server" OnClientClick="return AAA()" />

    function AAA()

    {

          if(ValidatePage("&Group1&Group2"))// 验证 没有设置的验证组,Group1,Group2(没有设置验证组的设置为空就可以了)

          {

                   return true;

          }

          return false;

    }

    ***

    二, ValidatorValidate方法

            参数: var                    要触发的Validator控件对象

    validationGroup  ValidationGroup属性的值

    event                验证对象ID(用于聚焦。需要focusOnError=“true”的情况下才有用)

    例子程序可以参考这里

    引用:http://www.cnblogs.com/ouryou/articles/1704866.html

  • 相关阅读:
    vue项目webpack配置terser-webpack-plugin 去掉项目中多余的debugger
    difference between count(1) and count(*)
    为什么PostgreSQL WAL归档很慢
    mysql_reset_connection()
    Oracle使用audit跟踪登录失败的连接信息
    .NET Standard 版本
    ASP.NET Web API版本
    我是如何用go-zero 实现一个中台系统的
    JAVA中文件写入的6种方法
    MySql 常用语句
  • 原文地址:https://www.cnblogs.com/chencidi/p/2131189.html
Copyright © 2020-2023  润新知