asp.net requiredfieldvalidators,为什么当我实现OnClientClick时它们不会触发

时间:2011-08-02 08:29:01

标签: javascript asp.net validation

我有一些requiredfieldvalidators。

当我有一个常规的asp:按钮时,一切顺利。

但是,现在我们已经在提交按钮上实现了OnClientClick事件:

<asp:Button ID="SaveButton" runat="server" Text="Save changes" OnClick="SaveButton_Click" OnClientClick="return SubmitForm2();" />

实现submitform2方法来设置提交按钮的标题(请稍候)并禁用它以避免双击。

  function SubmitForm2() {
        $("#SaveButton").attr("disabled", "true");
        $("#SaveButton").val("Please wait...");

        __doPostBack("SaveButton", "");
        return true;

    }

但我们看到的是,当我们运行此代码时,不会调用clientsidevalidators。

是因为我们自己运行__doPostBack,否则会触发其他代码(检查验证器)?

1 个答案:

答案 0 :(得分:1)

是的 - 回复正在发生,因为您自己正在__doPostBack。禁用该按钮后,按钮提交行为将被阻止验证器。

更好地实现所需功能的一个方法是将js-timer设置为短时间以禁用按钮,然后设置较长时间以启用按钮。例如,

function SubmitForm2() {
        // disable button after 30 ms
        setTimeout(function() {
            $("#SaveButton").attr("disabled", "true");
            $("#SaveButton").val("Please wait...");

            // enable button in 15 seconds so that in case validations are 
            // failed, user can correct and re-submit the page.
            setTimeout(function() {
               $("#SaveButton").removeAttr("disabled");
               $("#SaveButton").val("Save");
            }, 15000); 

        }, 30);

        return true;
    }

使用validator's client side API可以实现更好的实施。这是一个更简单但更好的修改前一个,

function SubmitForm2() {
            // disable button after 30 ms
            setTimeout(function() {
                $("#SaveButton").attr("disabled", "true");
                $("#SaveButton").val("Please wait...");

                // enable button in 1 second in case validations are 
                // failed, user can correct and re-submit the page.
                setTimeout(function() {
                   if (!Page_IsValid) {
                      // validations failed
                      $("#SaveButton").removeAttr("disabled");
                      $("#SaveButton").val("Save");
                   }
                }, 1000); 

            }, 30);

            return true;
        }