web-dev-qa-db-fra.com

Différence entre $ .getJSON () et $ .ajax () dans jQuery

J'appelle une action ASP.NET MVC

public JsonResult GetPatient(string patientID)
{
...

à partir de JavaScript en utilisant jQuery. L'appel suivant fonctionne

$.getJSON(
'/Services/GetPatient',
{ patientID: "1" },
function(jsonData) {
  alert(jsonData);
});

alors que celui-ci ne le fait pas.

$.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);
  }
});

Les deux atteignent la méthode d'action, mais la valeur patientID est null avec l'appel $ .ajax. Je voudrais utiliser l'appel $ .ajax pour certains des rappels avancés.

Toutes les pensées appréciées.

58
ChrisP

Type de contenu

Vous n'avez pas besoin de spécifier ce type de contenu pour les appels aux actions du contrôleur MVC. Le type de contenu spécial "application/json; charset = utf-8" n'est nécessaire que lorsque vous appelez ASP.NET AJAX "ScriptServices" et les méthodes de page. Le type de contenu par défaut de jQuery, "application/x-www-form-urlencoded", est approprié pour demander une action de contrôleur MVC.

Plus d'informations sur ce type de contenu ici: Le piratage JSON et comment ASP.NET AJAX 1.0 évite ces attaques

Les données

Les données est correctes telles que vous les avez. En transmettant jQuery à un objet JSON, vous serez sérialisé en tant que patientID = 1 dans les données POST. Ce formulaire standard explique comment MVC attend les paramètres.

Il vous suffit de mettre les paramètres entre guillemets, tels que "{'patientID': 1}" lorsque vous utilisez les services ASP.NET AJAX. Ils s'attendent à ce qu'une seule chaîne représentant un objet JSON soit analysée, plutôt que les variables individuelles dans les données POST.

JSON

Ce n'est pas un problème dans ce cas particulier, mais c'est une bonne idée de prendre l'habitude de citer des clés de chaîne ou des valeurs dans votre objet JSON. Si vous utilisez par inadvertance un mot clé réservé JavaScript comme clé ou valeur dans l'objet, sans le citer, vous rencontrerez un problème déroutant au point de débogage.

Inversement, il n'est pas nécessaire de citer des valeurs numériques ou booléennes. Il est toujours prudent de les utiliser directement dans l'objet.

Donc, en supposant que vous souhaitiez POST au lieu de GET, votre appel $ .ajax () pourrait ressembler à ceci:

$.ajax({
  type: 'POST',
  url: '/Services/GetPatient',
  data: { 'patientID' : 1 },
  dataType: 'json',
  success: function(jsonData) {
    alert(jsonData);
  },
  error: function() {
    alert('Error loading PatientID=' + id);
  }
});
35
Dave Ward

.getJson est simplement un wrapper autour de .ajax mais il fournit une signature de méthode plus simple car certains paramètres sont par défaut, par exemple dataType en json, type pour obtenir etc

N.B .load, .get et .post sont également de simples wrappers autour de la méthode .ajax.

19
redsquare

Remplacer

data: { patientID: "1" },

avec

data: "{ 'patientID': '1' }",

Lectures supplémentaires: 3 erreurs à éviter lors de l'utilisation de jQuery avec ASP.NET

11
rpcutts

Il y a beaucoup de confusion dans certaines des fonctions de jquery telles que $ .ajax, $ .get, $ .post, $ .getScript, $ .getJSON: quelle est la différence entre elles qui est la meilleure, qui est le rapide, qui à utiliser et quand ainsi est ci-dessous est la description d'eux pour les clarifier et se débarrasser de ce type de confusion.

La fonction $ .gettJSON () est une fonction abrégée Ajax (utilisez en interne $ .get () avec un script de type de données), ce qui équivaut à l'expression ci-dessous. Utilise des critères limités tels que Type de demande GET et Type de données json.

En savoir plus .. jquery-post-vs-get-vs-ajax

6
Vivek

La seule différence que je vois est que getJSON effectue une requête GET au lieu d'un POST.

4
kgiannakakis
contentType: 'application/json; charset=utf-8'

N'est pas bon. Au moins, ça ne marche pas pour moi. L'autre syntaxe est ok. Le paramètre que vous indiquez est au bon format.

0
Mathias F

avec $ .getJSON ()), il n'y a pas de rappel d'erreur, vous pouvez suivre le rappel réussi et aucun paramètre standard pris en charge, comme beforeSend, statusCode, mimeType, etc., si vous souhaitez utiliser $ .ajax ().

0
varmabsrk