Подтвердить что ты не робот

Разница между $.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 для некоторых передовых обратных вызовов.

Любые мысли оценили.

4b9b3361

Ответ 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.

Ответ 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().