【问题标题】:Calling javascript after a .net validator fails.net 验证器失败后调用 javascript
【发布时间】:2011-04-13 00:34:35
【问题描述】:

验证控件验证失败后是否可以调用 javascript 函数?

【问题讨论】:

    标签: .net javascript validation


    【解决方案1】:

    查看来自 MSDN 的文章“ASP.NET Validation in Depth” - 特别感兴趣的部分是提供客户端 API 的 Client Side Validation。您可以使用验证器对象的 isvalid 属性来确定其是否有效。验证器对象(在客户端)可以使用服务器端验证器控件的 ClientID 属性来引用。

    实现你想要的方法之一可以是

    1. 通过将 js 变量 Page_ValidationActive 设置为 false 来关闭 ASP.NET 验证
    2. 当回发发生时,使用 Page_Validators 属性遍历所有验证器并验证每个调用 ValidatorValidate
    3. 如果感兴趣的验证器无效,则调用您的函数。

    【讨论】:

      【解决方案2】:

      有一种未记录的方式。这取决于 Microsoft 不会更改用于客户端验证的 javascript 方法的名称,但幸运的是它会优雅地降级,这意味着如果 Microsoft 更改某些内容,它不会使您的网站崩溃。

      您需要存储指向原始函数的指针,然后覆盖 Microsoft 正在调用的函数。

      var pointerToMicrosoftValidator = ValidatorUpdateIsValid;
      ValidatorUpdateIsValid = function() {
          pointerToMicrosoftValidator();
          // do something after Microsoft finishes 
      }
      

      由于您只想在验证失败的情况下做某事,因此您应该在调用返回后检查页面是否有效:

      var pointerToMicrosoftValidator = ValidatorUpdateIsValid;
      ValidatorUpdateIsValid = function() {
          pointerToMicrosoftValidator();
          if (Page_IsValid) {
              alert("Passed Validation");
          } else {
              alert("Failed Validation");
          }
          // do something after Microsoft finishes 
      }
      

      我发现测试验证器是否在我认为是的页面上使用非常重要,以防我团队中的某个人在没有删除我的 javascript 的情况下删除了验证器。所以我加了一张支票:

      if (window.ValidatorUpdateIsValid) {
          alert("page with validator");
      }
      

      最后,我想确保我的函数是在 Microsoft 创建他们的代码之后创建的,因此我将定义包含在 jquery.ready 调用中。然后我可以在验证后通过替换“alert after”来调用一个方法。您应该在使用此功能之前删除所有警报。

      $(document).ready(function() {
          //intercept microsoftValidator
          if (window.ValidatorUpdateIsValid) {
              alert("page with validator");
              var pointerToMicrosoftValidator = ValidatorUpdateIsValid;
              ValidatorUpdateIsValid = function() {
                  alert("before");
                  if (window.pointerToMicrosoftValidator) {
                      pointerToMicrosoftValidator ();
                      if (Page_IsValid) {
                          alert("Passed Validation");
                      } else {
                          alert("Failed Validation");
                      }
                  }
                  alert("after");
              }
          }
      });
      

      【讨论】:

      • 我已经尝试过这个解决方案,但它不仅不起作用,而且还禁用了验证。在像他们在这里一样覆盖Page_ClientValidate 函数之后:stackoverflow.com/a/7692484/1813219 而不是ValidatorUpdateIsValid 它就像一个魅力。
      • 太棒了!他们可能改变了我在我们职位之间的 5 年中描述的无证方式。很高兴您找到了更好的新解决方案。
      猜你喜欢
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2018-02-08
      • 2011-10-09
      • 2018-06-19
      • 2021-11-18
      相关资源
      最近更新 更多