在onclick之后执行onclick和onclientclick webmethod

时间:2015-03-30 05:08:20

标签: javascript c# jquery asp.net ajax

我正在尝试使用webmethod(.asmx

设置变量

按钮使用onclick调用服务器端方法,onclientclick调用调用webmethod的javascript ajax。

我需要在调用onclick服务器端方法之前完全执行javascript代码,但似乎在回发之前没有完全执行ajax调用。

在回发之前调用警报,但是在回发后调用web方法。我需要在回发完成之前从webmethod设置变量。我试过从javascript返回一个假,但后来回发根本没有完成。

我在asp.net中使用Masterpages。此外,我在另一个项目中有一个类似的功能,工作正常,唯一的区别是在这一个我使用MasterPage。

<asp:TemplateField>
<ItemTemplate>
    <asp:Button ID="btnAddRegistration" ClientIDMode="Static" CssClass="btn-sm btn-default" runat="server"
        CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
        onclick="btnAddRegistration_Click"
        OnClientClick='<%# "getSetContactID(\"" + Container.DataItemIndex + "\")" %>'
        Text="Add &#010;Registration" />
 </ItemTemplate>
</asp:TemplateField>

Javascript(调用webmethod)

 function getSetContactID(rowIndex) {

    var CellValue, cell, dataItemIndex;
    var table = document.getElementById('<%=gvContactSearch.ClientID %>');

    $.ajax({
        type: "POST",
        url: "WebService1.asmx/setContactIDgvContact",
        data: '{DataItemIndex: "' + rowIndex + '"}',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: alert(rowIndex), <--this gets called before postback
        failure: function (response) {alert(response.d);}

        })
 }

Webservice方法

 [WebMethod]
        public string setContactIDGV1(int DataItemIndex){
           classDetails.gV1DataItemIndex = DataItemIndex; 
           return "";
        }

1 个答案:

答案 0 :(得分:3)

这里有一个经典的竞赛条件。

默认情况下,AJAX调用是异步的,因此当您触发AJAX调用时,JS代码块在逻辑上结束,并触发下一个顺序事件,在这种情况下是您的服务器端事件。然后是AJAX代码执行的功能和服务器端的onclick事件之间的竞争。我看到它的方式你有几个选择:

  1. 点击方法
  2. 在服务器端调用您的Web服务方法
  3. 防止JS块(event.preventDefault)内的默认元素操作,并在完成序列的AJAX success方法中挂钩内容
  4. 在AJAX调用上设置async: false选项