我有一个创建JSON对象的脚本并将其发送到我的Action Controller。 ActionController接收对象并知道如何将其模型绑定到ViewModel。
动作控制器非常简单,如下所示:
[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;
}
我已经调试了Action Controller,并且在我进入
之前,javascript警告已经完成(false)"return "Finished";
永远不会调用成功回调 我在哪里做错了?
答案 0 :(得分:3)
AJAX的重点在于它是异步的意味着你只能在成功回调中处理结果。 $.ajax
方法向服务器启动AJAX请求,并立即返回。在这个阶段,完成的值仍然是假的,你将离开该功能。很久以后,当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
}
});
另外,我建议您让控制器操作始终返回操作结果而不是字符串:
[HttpPost]
public ActionResult SaveNumberMatrix(NumberViewModel model) {
return Json("Finished");
}
您的代码的另一个问题是您将dataType: 'json'
指示为响应并从服务器返回字符串Finished
,这是一个无效的JSON。
答案 1 :(得分:0)
你没有进入成功回调,因为你没有发回有效的json,你需要发送json,因为你的dataType是json。因此它可能会引发错误。
来自jQuery文档:
dataTypeString
Default: Intelligent Guess (xml, json, script, or html)
The type of data that you're expecting back from the server.
在您的情况下,您指定的是json
,但显然没有发回json
答案 2 :(得分:0)
您的ajax请求似乎无法访问服务器。请使用ajax错误功能。
error: function(a,b,c){alert(a+b+c)}
找出问题
答案 3 :(得分:0)
将async参数添加为false(async:false),然后将同步调用AJAX方法。