我有一个控制器方法
[HttpPost]
public ActionResult GetUserData()
{
return Json(GetCurrentUser());
}
我通过这样的方法调用$ .ajax():
ServerCall: function (method, args, callback) {
$.ajax({
type: 'POST',
url: method,
data: JSON.stringify(args),
contentType: 'application/json;charset=utf8',
dataType: 'json',
success: function (result) {
if (callback) {
callback(result);
}
},
error: function (err) {
}
});
}
电话是:
ServerCall('GetUserData', null, function(data){
});
实际上,当我进行此调用时,$ .ajax会成功返回,但'data'为空。调试,responseText为空。在服务器端,调用GetUserData,它返回一个格式正确的Json对象(我已经创建了自己的JSON ActionResult并验证了数据确实被写入了响应流。
如果我在服务器端方法中添加一个虚拟参数:
[HttpPost]
public ActionResult GetUserData(string temp)
{
return Json(GetCurrentUser));
}
一切都很完美。浏览器是IE8。我的问题是,有人可以解释为什么会这样吗?
更新:
注意下面的解决方法解决方案:我仍然有兴趣知道根本原因。
答案 0 :(得分:4)
没有重复。
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult GetUserData()
{
return Json(new { foo = "bar" });
}
}
Index.cshtml
查看:
<script type="text/javascript">
var serverCall = function (method, args, callback) {
$.ajax({
type: 'POST',
url: method,
data: JSON.stringify(args),
contentType: 'application/json;charset=utf8',
dataType: 'json',
success: function (result) {
if (callback) {
callback(result);
}
},
error: function (err) {
}
});
};
serverCall('@Url.Action("GetUserData")', null, function (data) {
alert(data.foo);
});
</script>
结果:'bar'
会收到警报(正如预期的那样)。
答案 1 :(得分:4)
我能够在IE8中使用Darin的代码重现。虽然我不知道根本原因,但我认为这与IE8 JSON.stringify如何处理null有关。改变
data: JSON.stringify(args)
到
data: args ? JSON.stringify(args) : null
修复了问题。
请注意,问题是间歇性的 - 我看到每十个电话中就有一个出现故障。随着更改,超过100次测试,故障率为零。