从JavaScript中的Ajax调用触发服务器端按钮点击事件

6
我在页面上有一个提交按钮。
<asp:Button ID="btnSubmit" runat="server" Text="Save Test" OnClick="btnSubmit_Click"
                                        OnClientClick="return ValidateSaveTest(this);" />

在Javascript中,调用ValidateSaveTest函数来验证所有字段。
function ValidateSaveTest(Sender) {

            //do some validation, if fails return false from here. else move forward

        var parameters = {};
        parameters["parametersName"] = $("#" + hidTestId).val();

        var succeededAjaxFn = function(result) {
            if (result== true) {
                var isNewVersion = confirm("Confirmation message");
                if(isNewVersion)
                {
                        //Raise server side button click event. Dont call click side event anymore.
                        $("#" + "<%=btnSubmit.ClientID %>").click();
                }
                return false;
            }

        }
        var failedAjaxFn = function(result) { return false; }

            //jquery ajax call
        CallWebMethod("../Service.asmx", "IsTestUsed", parameters, succeededAjaxFn, failedAjaxFn);

        //async call, always return false hence no postback from here.
        //Need waiting unless ajax response is obtained.
        return false;
    }

我需要在 JavaScript 接收到 Ajax 响应后,从服务器端触发按钮点击事件。
2个回答

15

你可以从ClientScriptManager的GetPostBackEventReference方法中获取所需的JavaScript代码:

返回一个字符串,可用于在客户端事件中导致向服务器发送postback请求。

这通常用于编写像<asp:linkButton>这样的控件上的onclick属性,但你也可以在jQuery回调函数中使用它:

var succeededAjaxFn = function(result) {
  //Raise server side button click event. Dont call click side event anymore.
  <%= Page.ClientScript.GetPostBackEventReference(btnSubmit, String.Empty) %>;
}

<%= %> 块将为您编写以下 JavaScript:

__doPostBack('btnSubmit','')

这将以一种方式将表单发送回服务器,以使ASP.NET认为按钮已被点击,从而触发服务器端的btnSubmit_Click

请注意,使用此方法,您可以传递对实际控件的C#引用。您不需要担心其客户端ID,或者__doPostback() JavaScript函数的正确名称和参数。当您调用此方法时,所有这些都由ClientScriptManager负责处理。


点击事件是如何触发的?你有提到这段代码中触发了OnClick事件吗?我能理解它。 - Ali Foroughi
@AliForoughi,我编辑了我的答案,解释了服务器端事件将如何触发,这有帮助吗? - Michiel van Oosterhout
@ShantanuGupta,是的,我检查过了,它运行得很好,但我不明白为什么按钮的OnClick事件会被触发?为什么OnCommand或OnDataBinding事件不会被触发?因为michielvoo在他的代码中没有明确调用Onclick事件。他的解决方案很棒,但我不明白为什么是onclick?:( - Ali Foroughi
1
@AliForoughi:我从给出的 MSDN 参考文献中了解到,“返回一个字符串,可用于在客户端事件中引发对服务器的回发”。因此,使用 GetPostBackEventReference 方法可以得到需要为控件引发的事件。从 MSDN http://goo.gl/nKlGf 中可以看到,“当 UseSubmitBehavior 属性为 false 时,可以将 GetPostBackEventReference 方法与 Button 控件一起使用。在这种情况下,GetPostBackEventReference 方法返回 Button 控件的客户端回发事件”。 - Shantanu Gupta
当UseSubmitBehavior属性为false时,不会调用任何JavaScript函数,即直接调用已注册的服务器端函数而不经过客户端函数。 - Shantanu Gupta
显示剩余3条评论

3

试试这个

__doPostBack('<%=btDemo.ClientID%>','OnClick');

注意开头的双下划线

如果用户点击了按钮,这应该会触发一个回发。


2
这将触发回传,但不会引发按钮的服务器端单击事件。 - Shantanu Gupta
客户端ID对我也没用,但UniqueID有用。我的代码被纠缠在SharePoint 2010标记中,我注意到其他人提到了使用这个属性。此外,<%= Page.ClientScript.GetPostBackEventReference(this.SaveButton, string.Empty) %>; 对我也有效。 - Andez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接