5

我正在使用 jquery 进行 ajax 调用以获取 json 格式的数据。调用成功回调函数但数据为空。

$(document).ready(function () {
    $.ajax({
        url: "http://apps.sungardhe.com/StudentResearch/public/Research.svc/Schools",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: cbSchools
    });
});

function cbSchools(data) {
    if (data == null) {
        alert("data is null");
        return;
    }
    for (var school in data) {
        $("#ddSchool").append("<option value='" + data[school].ShortName + "'>" + data[school].ShortName + "</option>");
    }
}

使用提琴手我看到响应实际上是返回 json 数据,但由于某种原因 jquery 结果对象为空。谁能告诉我为什么?

4

3 回答 3

8

您被阻止跨域 XMLHttpRequests的同源策略阻止。由于您需要设置标头以从这样的 .Net Web 服务中获取 JSON,因此您处于困境中,您不能从浏览器发出这种请求,而不是来自不同的域。

Fiddler 可能正在显示内容,但浏览器不会让页面看到它,出于安全原因,它始终为空。解决此问题的一种方法是JSONP,但不幸的是,该服务似乎没有设置为支持它。

于 2010-07-27T20:06:42.867 回答
1

我相信你可以让你的电话通用(marduk 表示的原因)

为了处理这个问题,并使调用通用(使用 data 和 data.d),我在我的 ajax 调用(使用我的 asp.net 东西)中使用以下内容,以便它适用于旧服务和新服务:

   dataFilter: function(data)
    {
        var msg;
        if (typeof (JSON) !== 'undefined' &&
        typeof (JSON.parse) === 'function')
            msg = JSON.parse(data);
        else
            msg = eval('(' + data + ')');
        if (msg.hasOwnProperty('d'))
            return msg.d;
        else
            return msg;
    },

编辑:如果它真的为空而不是“未定义”,那么跨域问题可能在这里起作用。

于 2010-07-27T20:15:03.267 回答
0

试试这个

if (data.d == null) {
    alert("data.d is null");
    return;
}

由于您的返回数据类型是 json,因此数据位于响应对象中的数据“d”变量中。

于 2010-07-27T20:04:06.857 回答