【问题标题】:firing both onclientclick and Client side validation from validation control on button Client click从按钮客户端单击上的验证控件触发 onclientclick 和客户端验证
【发布时间】:2011-08-01 10:33:48
【问题描述】:

我的页面上有几个 ASP 文本框控件,其中添加了自定义验证器。我有保存按钮,它验证这些文本框。我刚刚添加了与文本框相同的验证组。

为了满足额外的要求,我为保存按钮添加了 onClientClick 函数。但是很高兴发现由于验证组(验证器控件)导致的验证没有触发,而是调用了 onClientClick 函数并调用了服务器端 Click 事件。

Javascript 代码

function ValidateInputs(source, args) {
            var regex = /^(-{0,1}\d{1,100})$/;
            if (args.Value.length < 1) {
                $("span[id$='spn_error']").html('Please Enter ' + $(source).attr("errormessage"));
                $("span[id$='spn_error']").show();
                args.IsValid = false;
                return;
            }
            else if (!regex.test(args.Value)) {
                $("span[id$='spn_error']").html($(source).attr("errormessage") + ' allows only numbers');
                $("span[id$='spn_error']").show();
                args.IsValid = false;
                return;
            }
            else {
                if ($("span[id$='spn_error']").html().indexOf($(source).attr("errormessage")) >= 0)
                    $("span[id$='spn_error']").hide();
                args.IsValid = true;
                return;
            }
        }

function isValidTracker() {
//Dummy Code Say Confirm button
return(confirm('Are you sure');)

}

HTML 代码

<span class="errormesg" runat="server" id="spn_error" style="display: none;
                        font-size: 9px;"></span>
<asp:TextBox ID="txtLastMonthCount" runat="server" CssClass="inputbox" Width="75px" autocomplete="off" onkeypress="return isNumberKey(event);" ValidationGroup="g1"></asp:TextBox>

<asp:CustomValidator ID="CVLastMonthCount" runat="server" ErrorMessage="Last Months Closing Count" Text="<img src='../images/alert.gif' alt='Please Enter Last Months Closing Count' title='Please Enter Last Months Closing Count' />" 
    ValidationGroup="g1" ClientValidationFunction="ValidateInputs" OnServerValidate="ValidateInputs" ControlToValidate="txtLastMonthCount" ValidateEmptyText="true"></asp:CustomValidator>

<asp:Button ID="btnSave" runat="server" Text="Save" CssClass="button" ValidationGroup="g1" OnClientClick="return isValidTracker();" OnClick="btnSave_Click" />

请帮助我找到触发 onclientclick 和保存按钮单击的验证控件的解决方案。

【问题讨论】:

    标签: javascript asp.net onclientclick validation-controls


    【解决方案1】:

    将 OnClientClick 从 return isValidTracker() 更改为 if (!isValidTracker()) return false;

    【讨论】:

    • 当然可以。你能解释一下这背后的原因吗,因为没有太大变化。
    • 我不确定,但猜测验证控件将自己的处理程序附加到重新评估验证组中所有验证器的按钮的单击事件。但是由于您从内联代码返回布尔值,因此不涉及进一步的处理程序。
    【解决方案2】:

    感谢您提供的解决方案。我在谷歌搜索时也得到了一个解决方案,想分享它,因为它对像我这样的其他人在其他各种情况下都有帮助。

    function isValidTracker() {
    
        if (Page_IsValid) {
            return(confirm('Are you sure');)//Dummy Code Say Confirm button
        }
        else
        {
            return false;
        }
    
        }
    

    其中 Page_IsValid 是由 ASP.Net 验证控件设置的 Java 脚本变量。当所有验证控件都成功验证时,它设置为 true。谢谢:)

    【讨论】:

    • 您是否尝试在所有文本框中填写正确的值,然后按 Tab 键?
    • 是的。我确实尝试过,效果很好。上述函数仅在保存按钮的 onClientClick 上调用
    【解决方案3】:

    OneHalf 的解决方案有效,但我会将最终检查放入您的验证器中 - 这样可以确保您不会询问用户“您确定吗?”直到你知道他们的行为是有效的......

        function ValidateInputs(source, args) {
        var regex = /^(-{0,1}\d{1,100})$/;
        if (args.Value.length < 1) {                 
            $("span[id$='spn_error']").html('Please Enter ' + $(source).attr("errormessage"));
            $("span[id$='spn_error']").show();                 
            args.IsValid = false;                 
        }             
        else if (!regex.test(args.Value)) {                 
            $("span[id$='spn_error']").html($(source).attr("errormessage") + ' allows only numbers');                
            $("span[id$='spn_error']").show();                 
            args.IsValid = false;                
        } else {                 
            if ($("span[id$='spn_error']").html().indexOf($(source).attr("errormessage")) >= 0)                     
                $("span[id$='spn_error']").hide();                 
            args.IsValid = true;
        }
    
        if (args.IsValid) args.IsValid = isValidTracker();
    }  
    

    虽然我同意 ASP.NET 团队存在疏忽 - 您的实现似乎更直观,应该得到支持。

    B

    【讨论】:

    • 假设我有多个文本框控件调用相同的自定义验证函数。在那种情况下,这个函数可能会被多次调用,这不是我们想要的结果。
    • @suryakiran - 同意 - 这是一个完全不同的场景。如果您想要不同场景的答案,请发布不同的场景:) 在这种情况下,您有一个没有 ControlToValidate 属性的自定义验证器(因此假设您将为组中的所有控件使用该自定义验证器)此解决方案有效很好。
    【解决方案4】:

    您好,我也遇到了同样的问题。 CausesValidation="true" 属性解决了我的问题。

    【讨论】:

    • 你能详细说明一下吗
    • 我在列表视图中有一个下拉列表,下拉列表中选择的值对于列表视图中的所有行都必须不同,因为我编写了一个我在保存按钮上调用的 javascript 函数还有其他控件是必需的,并且对于该必填字段验证器在同一个按钮上使用和验证。
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多