【问题标题】:Returning false from Client-Side Handler does not Prevent Postback从客户端处理程序返回 false 不会阻止回发
【发布时间】:2013-10-01 16:16:46
【问题描述】:

我在 WebForms 页面上有以下按钮:

<asp:Button ID="btnNewProgramNext" runat="server" Text="Next &gt;&gt;" />

我有以下 javascript/jquery 来处理它的事件。

$('#<%= btnNewProgramNext.ClientID %>').on('click', function (e) {
    var errorMessage = '';
    var ok = false;
    var newCompany = $('#<%= NewCompanyMode.ClientID %>').val();
    if (newCompany == 1) {
        if (!$('#<%= txtProgramCompanyName.ClientID %>').val())
            errorMessage = 'You must enter a company name.';
        else if (!$('#<%= txtContactFirstName.ClientID %>').val())
            errorMessage = 'You must enter a contact first name.';
        else if (!$('#<%= txtContactLastName.ClientID %>').val())
            errorMessage = 'You must enter a contact last name.';
        else
            ok = true;
    }
    else {
        // Do something else
        ok = true;
    }
    $('#newProgramErrorMessage').text(errorMessage);
    return ok;
});

问题是,当这个处理程序返回 false 时(当 ok 为 false 时,或者当我将最后一行更改为 return false 时),回发仍然发生。

有什么技巧可以防止来自 javascript 的回发?我预计这会奏效。

【问题讨论】:

    标签: javascript jquery asp.net webforms


    【解决方案1】:

    你想要 e.preventDefault() 来取消按钮点击事件。

    $('#<%= btnNewProgramNext.ClientID %>').on('click', function (e) {
        var errorMessage = '';
        var ok = false;
        var newCompany = $('#<%= NewCompanyMode.ClientID %>').val();
        if (newCompany == 1) {
            if ($('#<%= txtProgramCompanyName.ClientID %>').val() == "")
                errorMessage = 'You must enter a company name.';
            else if ($('#<%= txtContactFirstName.ClientID %>').val() == "")
                errorMessage = 'You must enter a contact first name.';
            else if ($('#<%= txtContactLastName.ClientID %>').val() == "")
                errorMessage = 'You must enter a contact last name.';
            else
                ok = true;
        } else {
            // Do something else
            ok = true;
        }
        if (!ok) {
            e.preventDefault();
            $('#newProgramErrorMessage').text(errorMessage);
        }
        // else everything is valid, so post back to server.
    });
    

    【讨论】:

    • 那里确实似乎有很多令人困惑的信息。根据this question 的主要答案,“从 jQuery 事件处理程序中返回 false 实际上与在传递的 jQuery.Event 对象上调用 e.preventDefault 和 e.stopPropagation 相同。”
    • 您所说的信息对于常规 html 控件是正确的。在 OP 中,您正在使用 ASP.Net Sever 控件,该控件具有自己的 javascript 来回发到服务器。理想情况下,如果您使用 ASP.Net 服务器控件(Garrison Neely 已回答),您希望使用 ClientClick。这是example
    【解决方案2】:

    你为什么不尝试通过ClientClick 属性来连接它,而不是使用jQuery 来订阅click 事件。这可能是 ASP.NET 用来确定是否终止 PostBack 的路由。

    【讨论】:

    • 使用OnClientClick 确实有效。仍在研究为什么我不能在这里使用 jQuery。
    • 我认为这很明显。我敢打赌,除非在标记中声明了OnClientClick,否则它会返回true。 ASP.NET WebForms 是在 jQuery 之前创建的,并且不知道查看任何其他路径。只需将 JavaScript 声明为离散函数并从 OnClientClick 调用它。
    • 对我来说不明显的部分是如何在常规 HTML 中返回 false 工作?它阻止对操作的进一步处理。它不依赖于 WebForms。那么为什么这里需要 WebForms 呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2012-02-03
    • 2020-07-01
    • 2019-05-22
    相关资源
    最近更新 更多