C# 使用AJAX调用的JavaScript对话框不同步

C# 使用AJAX调用的JavaScript对话框不同步,c#,javascript,ajax,dialog,C#,Javascript,Ajax,Dialog,我在一些JavaScript上遇到了一个问题,这些JavaScript用于显示基于C ViewModel的JQUERY对话框 我在中继器中有一个ASP下拉列表,显示“注册日期”信息。其想法是,当用户从列表中选择日期时,会出现JavaScript对话框,显示与使用特定视图模型属性的注册相关的更全面的信息摘要。在标准$document.ready上调用CustomerSummary函数,用于相关页面 JS代码 调试期间发生了什么 这里发生的事情发生在这条线上: $("#dialog").html("

我在一些JavaScript上遇到了一个问题,这些JavaScript用于显示基于C ViewModel的JQUERY对话框

我在中继器中有一个ASP下拉列表,显示“注册日期”信息。其想法是,当用户从列表中选择日期时,会出现JavaScript对话框,显示与使用特定视图模型属性的注册相关的更全面的信息摘要。在标准$document.ready上调用CustomerSummary函数,用于相关页面

JS代码

调试期间发生了什么

这里发生的事情发生在这条线上:

$("#dialog").html("Registration Id: " + data.RegistrationId + "<br />" +
当我第一次从菜单中选择一个日期并调用change函数时,我会收到上面的错误消息,并且不会出现对话框,如果我检查数据,我确实可以看到它是未定义的。然后,一旦我从下拉菜单中选择了一个不同的数据,我点击了我的断点change.function data设置为从上一个AJAX调用中检索到的数据,然后弹出对话框,但使用上一个请求数据,结果将停留在此循环中,每次选择数据时,我都会看到前面的选择信息

有人能指出为什么我总是有一个选择不同步,我相信这是因为第一个更改请求,但我不明白为什么AJAX调用在我选择下一个下拉项之前没有将数据设置为所需的结果。

这不起作用

data = MakeAJAXCall(registrationId);
因为MakeAJAXCall正在执行一个Ajax调用,并且它是异步的,所以返回的执行顺序与函数中的返回顺序不同。因此,您需要使用回调

尝试将代码更改为以下内容:

MakeAJAXCall(registrationId, function(data){
 $("#dialog").html("Registration Id: " + data.RegistrationId + "<br />" +
                                   "Permit From: " + data.PermitFrom + "<br />" +
                                   "Permit To: " + data.PermitTo + "<br />" +
                                   "Registration Status: " + data.RegistrationStatus 
                );
});
然后在Ajax调用中,您还需要进行以下更改:

function MakeAJAXCall(regId, callback)
    {
        $.ajax({
            type: "post",
            contentType: "application/json; charset=utf-8",
            dataType: "text json",
            url: "/Secure/CustomerSummary.aspx/GetRegistration",
            data: "{ regId: \"" + regId + "\" }",

            success: function (msg) {                
                data = msg.d;  
                callback(data); //<--- You callback function is called here              
            },

            error: function (xOptions, textStatus)
            {                
                console.log(textStatus);
                console.log(xOptions);
            }
        });
    }    
这行不通

data = MakeAJAXCall(registrationId);
因为MakeAJAXCall正在执行一个Ajax调用,并且它是异步的,所以返回的执行顺序与函数中的返回顺序不同。因此,您需要使用回调

尝试将代码更改为以下内容:

MakeAJAXCall(registrationId, function(data){
 $("#dialog").html("Registration Id: " + data.RegistrationId + "<br />" +
                                   "Permit From: " + data.PermitFrom + "<br />" +
                                   "Permit To: " + data.PermitTo + "<br />" +
                                   "Registration Status: " + data.RegistrationStatus 
                );
});
然后在Ajax调用中,您还需要进行以下更改:

function MakeAJAXCall(regId, callback)
    {
        $.ajax({
            type: "post",
            contentType: "application/json; charset=utf-8",
            dataType: "text json",
            url: "/Secure/CustomerSummary.aspx/GetRegistration",
            data: "{ regId: \"" + regId + "\" }",

            success: function (msg) {                
                data = msg.d;  
                callback(data); //<--- You callback function is called here              
            },

            error: function (xOptions, textStatus)
            {                
                console.log(textStatus);
                console.log(xOptions);
            }
        });
    }    

Ajax中的第一个应用程序是异步的。这意味着您的呼叫将在后台运行,这就是您使用回调的原因。当您的呼叫完成并出现成功/错误时,例如10秒后,将调用正确的函数。同时,设置和创建结果的其他代码也会运行,很可能在从ajax查询收到任何答案之前运行。正如@Dalorzo所建议的,将结果对话框代码包装在回调中,这样代码将在收到结果后运行。

Ajax中的第一个a是异步的。这意味着您的呼叫将在后台运行,这就是您使用回调的原因。当您的呼叫完成并出现成功/错误时,例如10秒后,将调用正确的函数。同时,设置和创建结果的其他代码也会运行,很可能在从ajax查询收到任何答案之前运行。正如@Dalorzo所建议的,将结果对话框代码包装在回调中,这样代码将在收到结果后运行