2010-09-16 105 views

回答

2

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

之一的方式来实现你想要可以

  1. 关闭ASP.NET验证什么被JS设置变量Page_ValidationActive
  2. 当后回用Page_Validators财产,并通过所有验证发生迭代验证每个呼叫ValidatorValidate
  3. 如果感兴趣的验证器无效,请调用您的函数。
2

有一个无证的方法。这取决于微软不更改其用于客户端验证的JavaScript方法的名称,但幸运的是,它会优雅地降级,这意味着如果微软改变了某些东西,它不会使您的网站崩溃。

最低限度,您需要存储指向原始函数的指针,然后覆盖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"); 
} 

最后,我想确保我的函数创建微软创建自己的代码后,所以我包括在jquery.ready调用的定义。然后,我可以在验证之后通过替换“之后的警报”来调用方法。在开始实施之前,您应该删除所有警报。

$(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"); 
     } 
    } 
}); 
+1

我试过这个解决方案,但它不但没有工作,而且禁用了验证。在覆盖'Page_ClientValidate'功能之后,就像他们在这里所做的那样:http://stackoverflow.com/a/7692484/1813219而不是'ValidatorUpdateIsValid'它像魅力一样工作。 – 2016-10-14 13:33:01

+0

太棒了!可能是他们改变了我在我们职位之间的5年间所描述的无证方式。很高兴你找到了一个更好的解决方案。 – Jim 2017-03-08 16:22:17