Разница между $.getJSON() и $.ajax() в jQuery
Я вызываю действие ASP.NET MVC
public JsonResult GetPatient(string patientID)
{
...
из JavaScript с помощью jQuery. Следующий вызов работает
$.getJSON(
'/Services/GetPatient',
{ patientID: "1" },
function(jsonData) {
alert(jsonData);
});
тогда как этого нет.
$.ajax({
type: 'POST',
url: '/Services/GetPatient',
data: { patientID: "1" },
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(jsonData) {
alert(jsonData);
},
error: function() {
alert('Error loading PatientID=' + id);
}
});
Оба подходят к методу действия, но значение идентификатора пациента равно null w/$.ajax. Я бы хотел использовать вызов $.ajax для некоторых передовых обратных вызовов.
Любые мысли оценили.
Ответы
Ответ 1
Content-Type
Вам не нужно указывать этот тип содержимого при вызовах действий контроллера MVC. Специальный тип содержимого "application/json; charset = utf-8" необходим только при вызове ASP.NET AJAX "ScriptServices" и методах страницы. jQuery default contentType "application/x-www-form-urlencoded" подходит для запроса действия контроллера MVC.
Подробнее об этом типе контента здесь: JSON Hijacking and As ASP.NET AJAX 1.0 Избегает этих атак
Данные
Данные верны, как и у вас. Передавая jQuery объект JSON, как и у вас, он будет сериализован как patientID = 1 в данных POST. Эта стандартная форма - это то, как MVC ожидает параметры.
При использовании служб ASP.NET AJAX вам нужно всего лишь заключить параметры в кавычки типа "{'patientID: 1}". Они ожидают, что одна строка, представляющая объект JSON, будет проанализирована, а не отдельные переменные в данных POST.
JSON
Это не проблема в этом конкретном случае, но это хорошая идея, чтобы привыкнуть цитировать любые строковые ключи или значения в вашем объекте JSON. Если вы случайно используете зарезервированное ключевое слово JavaScript в качестве ключа или значения в объекте, не цитируя его, вы столкнетесь с запутанной проблемой.
И наоборот, вам не нужно указывать числовые или логические значения. Всегда безопасно использовать их непосредственно в объекте.
Итак, если вы хотите POST вместо GET, ваш вызов $.ajax() может выглядеть следующим образом:
$.ajax({
type: 'POST',
url: '/Services/GetPatient',
data: { 'patientID' : 1 },
dataType: 'json',
success: function(jsonData) {
alert(jsonData);
},
error: function() {
alert('Error loading PatientID=' + id);
}
});
Ответ 2
.getJson - это просто оболочка вокруг .ajax, но она обеспечивает более простую сигнатуру метода, поскольку некоторые из параметров дефолтны, например dataType, для json, type для получения etc
N.B.load,.get и .post также являются простыми оболочками вокруг метода .ajax.
Ответ 3
Заменить
data: { patientID: "1" },
с
data: "{ 'patientID': '1' }",
Дальнейшее чтение: 3 ошибки, которые следует избегать при использовании jQuery с ASP.NET
Ответ 4
Существует некоторая путаница в некоторых функциях jquery, таких как $.ajax, $.get, $.post, $.getScript, $.getJSON. В чем разница между ними, которая является лучшей, которая является быстрой, которая использовать и, когда это так, ниже их описание, чтобы прояснить их и избавиться от этого типа путаницы.
Функция $.getJSON() является сокращенной Ajax-функцией (внутренне использует $.get() со сценарием типа данных), которая эквивалентна приведенному ниже выражению, использует некоторые ограниченные критерии, такие как тип запроса - GET, а тип данных - json.
Читать дальше.. jquery-post-vs-get-vs-ajax
Ответ 5
Единственное различие, которое я вижу, это то, что getJSON выполняет запрос GET вместо POST.
Ответ 6
contentType: 'application/json; charset=utf-8'
Нехорошо. По крайней мере, это не работает для меня. Другой синтаксис в порядке. Параметр, который вы поставляете, находится в правильном формате.
Ответ 7
с $.getJSON()) нет никакого обратного вызова ошибки, вы можете отслеживать успешную обратную связь и нет стандартных параметров, поддерживаемых как beforeSend, statusCode, mimeType и т.д., если вы хотите использовать $.ajax().