为什么没有参数的POST不会返回JSON

时间:2012-04-16 03:42:18

标签: asp.net-mvc jquery

我有一个控制器方法

[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。我的问题是,有人可以解释为什么会这样吗?

更新:

注意下面的解决方法解决方案:我仍然有兴趣知道根本原因。

2 个答案:

答案 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次测试,故障率为零。