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