2010-07-27 6 views
4

Я делаю вызов ajax с помощью jquery для получения данных в формате json. вызывается функция обратного вызова успеха, но данные пустые.jquery ajax success result is null

$(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 является недействительным. может ли кто-нибудь сказать мне, почему?

ответ

7

Вы заблокированы same-origin policy, который предотвращает междоменные XMLHttpRequests. Поскольку вам нужно установить заголовки, чтобы вернуть JSON из веб-сервиса .Net, как это, вы находитесь в трудном положении, вы просто не можете сделать такой запрос из браузера, а не из другого домена.

Скрипач может показывать содержимое, но браузер не собирается просматривать страницу, поскольку по соображениям безопасности он всегда будет нулевым. Один из способов: JSONP, но, к сожалению, это не похоже на то, что служба настроена для его поддержки.

0

попробовать этот

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

, поскольку ваше возвращение тип данных JSON, данные в данных, «D», переменной в объекте ответа.

+1

Если 'data' уже имеет значение null, как он может иметь свойство? :) Это просто вызовет ошибку в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. –

+1

, если вы попытаетесь получить доступ к data.d, вы получите ошибку javascript «data is null» –

1

Я считаю, что вы можете сделать ваши звонки родовой (причина, как Мардук показывает)

Чтобы справиться с этим, и сделать звонки родовыми (работает с данными и data.d), я использую следующий в моем АЯКСЕ вызовов (с моей 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; 
    }, 

EDIT: Если это действительно нуль AND NOT «не определено», то проблема кросс домена может быть в игре здесь.

+0

Нет необходимости обрабатывать его самостоятельно, это уже сделано, кроме '.d'. При получении JSON jQuery [использует '$ .parseJSON()'] (http://github.com/jquery/jquery/blob/master/src/ajax.js), который уже проверяет возможности браузера (например, 'JSON.parse () ') и проверяет его на достоверность и т. д., посмотрите на себя здесь: http://github.com/jquery/jquery/blob/master/src/core.js#L483 –