4

我有一个控制器方法

[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 成功返回,但“数据”为空。调试,responseText 为空。在服务器端,调用 GetUserData,它返回一个格式正确的 Json 对象(我已经创建了自己的 JSON ActionResult 并验证了数据确实正在写入响应流。

如果我向服务器端方法添加一个虚拟参数:

[HttpPost]
public ActionResult GetUserData(string temp)
{
    return Json(GetCurrentUser));
}

一切正常。浏览器是IE8。我的问题是,谁能解释为什么会这样?

更新:

请注意以下解决方法:我仍然有兴趣了解根本原因。

4

2 回答 2

4

我能够在 IE8 中使用 Darin 的代码进行重现。虽然我不知道根本原因,但我认为这与 IE8 JSON.stringify 处理 null 的方式有关。改变

data: JSON.stringify(args)

data: args ? JSON.stringify(args) : null

解决了这个问题。

请注意,问题是间歇性的——我看到每十个电话中就有一个失败。随着变化,超过100次测试,失败率为零。

于 2012-04-18T18:18:53.900 回答
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'被警告(如预期的那样)。

于 2012-04-16T06:16:25.027 回答