【问题标题】:Can I run some custom script after ASP.NET client side page validation fails?ASP.NET 客户端页面验证失败后,我可以运行一些自定义脚本吗?
【发布时间】:2011-12-03 06:51:22
【问题描述】:

如果,且仅当,客户​​端页面验证失败,并且无法确定我可以将其连接到哪里,我正在尝试运行一些客户端脚本。

如果我将我的 JavaScript 函数绑定到提交表单的按钮的 OnClientClick,它会在客户端验证之前运行。如果我将它绑定到表单的 OnSubmit,则只有在验证通过时才会触发。

关于如何或在哪里可以连接这样的东西有什么想法吗?或者,如果您有其他建议,我愿意接受。

<form id="frm" runat="server" 
     onsubmit="FUNCTION HERE WONT FIRE IF VALIDATION FAILS">
<asp:requiredfieldvalidator id="vld" runat="server" controltovalidate="txt"/>
<asp:textbox id="txt" runat="server"></asp:textbox>

<asp:button id="cmd" runat="server" OnClick="dosomething"
     OnClientClick="FUNCTION FIRES BEFORE VALIDATION OCCURS">

</form>

【问题讨论】:

    标签: javascript asp.net


    【解决方案1】:

    在页面标记文件的末尾添加以下脚本:

    var originalValidationFunction = Page_ClientValidate;
    if (originalValidationFunction && typeof (originalValidationFunction) == "function") {
        Page_ClientValidate = function (validationGroup) {
            originalValidationFunction(validationGroup);
    
            if (!Page_IsValid) {
                // your code here
                alert("oops!");
            }
        };
    }
    

    【讨论】:

    • 我比接受的答案更喜欢这个,因为它不会强迫我自己控制验证,之后只能搭载。
    • 这是我找到的最佳解决方案。
    • 不适合我。我可以在调试器中看到它只在validationGroup设置为空字符串的情况下被调用,而不是为其他验证组调用,Page_IsValid在到达if时为true,然后在退出函数时变为false。
    • 另外我认为这段代码不正确。 Page_ClientValidate 返回 true 或 false,覆盖函数应返回 originalValidationFunction 返回的值
    【解决方案2】:

    尝试使用Page_ClientValidate("") 从 JavaScript 触发验证,然后您可以运行一些自定义代码:

    validate = function(){
        var isValid = Page_ClientValidate(""); //parameter is the validation group - thanks @Jeff
        if (isValid){
            isValid = somethingToCheck();
        }
        return isValid;
    }
    
    <asp:Button ID="Button1" runat="server" CausesValidation="false" OnClientClick="return validate();" ... />
    

    【讨论】:

    • 打败我! @Doozer,参数是验证组,所以如果你使用一个,你需要把它传入:Page_ClientValidate("MyValidationGroup")
    • 啊...这看起来是正确的路径。在您的示例中,我是否将 Button1 设置为 CausesValidation="false",或者这很重要?
    • @DoozerBlake:嗯,如果您不想在调用Page_ClientValidate("") 之前关闭验证,那么我会暂时设置CausesValidation="false"
    • 这似乎无关紧要。我对两者都进行了尝试,并且 OnClientClick 似乎在验证发生之前触发了。感谢您的帮助。
    • 只是不要错过将validationGroup放入Page_ClientValidate参数的部分。
    【解决方案3】:

    所以你有两种选择如何处理它:

    1. 使用提供ClientValidationFunction 功能的CustomValidator 验证器,并且在您的自定义验证函数中显然您知道验证是否失败。它通过接受要在验证时使用的 JavaScript 函数,为您在客户端验证方面提供尽可能多的灵活性。

    2. 通过 JavaScript (+jQuery) 访问验证器的 isValid 属性,通过 JavaScript 访问验证器状态:

     var anonymousValidator = $("#<%= vldCommentText.ClientID %>")[0];
     ValidatorEnable(anonymousValidator, true);
     if (!anonymousValidator.isvalid) 
     {
         // ...
     }
    

    【讨论】:

    • 我知道 CustomValidator 的,但是如果页面上的所有其他验证器都有效,我怎么知道在这个 CustomValidator 函数中?上面的示例使用一个字段,但我所讨论的表单上有 20 多个验证器。我需要先检查他们的状态吗?
    • @Doozer Blake :您必须在原始问题中提到这一点。所以检查多个验证器的状态验证组功能已经到位。请参阅 Scott Gu 的精彩文章:weblogs.asp.net/scottgu/archive/2004/10/24/246945.aspx
    • 对不起,我没有更具体地说明这一点。不过感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2011-07-20
    • 2014-02-28
    • 2010-09-12
    • 1970-01-01
    • 2020-09-21
    • 2011-02-21
    相关资源
    最近更新 更多