我正在尝试使用网络方法(.asmx)设置变量

该按钮使用onclick调用服务器端方法,并使用onclientclick调用javascript ajax来调用web方法。

我需要在调用onclick服务器端方法之前完全执行javascript代码,但是似乎在进行回发之前aajax调用并未完全执行。

在回发之前调用警报,但是在回发之后调用web方法。在回发完成之前,我需要通过web方法设置变量。我尝试从javascript返回false,但根本不会执行回发。

我在asp.net中使用母版页。我在另一个工作正常的项目中也有类似的功能,唯一的区别是我正在使用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);}

        })
 }


Web服务方法

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

最佳答案

您在这里拥有的是经典的竞争条件场景。

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


在服务器端的click方法中调用您的Web服务方法
防止在JS块(event.preventDefault)中执行默认的元素操作,并在AJAX success方法内完成操作,以完成序列
在AJAX调用上设置async: false选项

07-24 09:46
查看更多