我有一个脚本,可以创建 JSON 对象并将其发送到我的操作 Controller 。 ActionController 接收对象并知道如何将其模型绑定(bind)到 ViewModel。
Action Controller 非常简单,如下所示:
[HttpPost]
public String SaveNumberMatrix(NumberViewModel model) {
return "Finished";
}
AJAX 功能:
function saveNumberMatrix(object, actioncontroller) {
var finished = false;
$.ajax({
url: actioncontroller,
type: 'POST',
data: JSON.stringify(object),
dataType: 'json',
processData: false,
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert(data);
finished = true;
},
});
alert(finished);
return finished;
}
我已经调试了操作 Controller ,并且在我进入之前 JavaScript 警报已完成(假)
"return "Finished";
成功回调永远不会被调用 我哪里做错了?
最佳答案
AJAX 的重点在于它是异步的,这意味着您只能在成功回调中处理结果。 $.ajax
方法向服务器发起 AJAX 请求并立即返回。在此阶段,finished 的值仍然为 false,并且您将离开该函数。很久以后,当 AJAX 完成时,就会执行成功回调。只有在这个回调中,您才能使用从服务器发送的结果。
使用 AJAX 时,不应以顺序和同步的方式组织 JavaScript 代码。
所以应该是这样的:
$.ajax({
url: '/actioncontroller/savenumbermatrix',
type: 'POST',
data: JSON.stringify(object),
dataType: 'json',
processData: false,
contentType: 'application/json; charset=utf-8',
success: function (data) {
// TODO: only here you can use the results of an AJAX call
}
});
此外,我建议您让 Controller 操作始终返回操作结果而不是字符串:
[HttpPost]
public ActionResult SaveNumberMatrix(NumberViewModel model) {
return Json("Finished");
}
您的代码的另一个问题是您指示 dataType: 'json'
作为响应并返回字符串 Finished
来自服务器的无效 JSON。
关于javascript - Action Controller 完成但 AJAX 成功回调未调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779063/