在 .net 验证程序失败后调用 javascript

Calling javascript after a .net validator fails

提问人:Cato Johnston 提问时间:9/16/2010 最后编辑:LarsHCato Johnston 更新时间:7/11/2011 访问量:2739

问:

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

.NET JavaScript 验证

评论


答:

2赞 VinayC 9/16/2010 #1

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

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

  1. 通过将 js 变量设置为 false 来关闭 ASP.NET 验证Page_ValidationActive
  2. 当回发发生时,使用 property 遍历所有验证器并验证每个调用。Page_ValidatorsValidatorValidate
  3. 如果感兴趣的验证器无效,则调用您的函数。
2赞 Jim 6/23/2011 #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");
        }
    }
});

评论

1赞 Mariusz Ignatowicz 10/14/2016
我尝试过这个解决方案,但它不仅不起作用,而且还禁用了验证。在像他们在这里所做的那样覆盖功能之后:stackoverflow.com/a/7692484/1813219 而不是它像魅力一样工作。Page_ClientValidateValidatorUpdateIsValid
0赞 Jim 3/9/2017
伟大!可能是他们改变了我在我们职位之间的 5 年中描述的无证方式。很高兴您找到了一个新的更好的解决方案。