58 votes

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 nulle avec l'appel $.ajax. J'aimerais utiliser l'appel $.ajax pour certains des rappels avancés.

Toute réflexion est la bienvenue.

35voto

Dave Ward Points 36006

Type de contenu

Vous n'avez pas besoin de spécifier ce type de contenu pour les appels aux actions des contrôleurs MVC. Le type de contenu spécial "application/json ; charset=utf-8" n'est nécessaire que lors de l'appel des méthodes ASP.NET AJAX "ScriptServices" et 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.

Pour en savoir plus sur ce type de contenu, cliquez ici : Détournement de JSON et comment ASP.NET AJAX 1.0 évite ces attaques

Données

Les données es correct comme vous l'avez fait. En passant à jQuery un objet JSON, comme vous l'avez fait, il sera sérialisé en tant que patientID=1 dans les données POST. Cette forme standard est la façon dont MVC attend les paramètres.

Il suffit de mettre les paramètres entre guillemets, comme "{ '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 précis, mais c'est une bonne idée de prendre l'habitude de citer toute clé ou valeur de type chaîne 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 de confusion et de débogage.

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

Donc, en supposant que vous souhaitiez effectivement utiliser le POST au lieu du 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);
  }
});

1 votes

Merci. Cela a résolu le problème. J'ai utilisé $.compactJSON() pour formater l'objet JS en JSON pour l'option de données.

0 votes

Comme $.compactJSON n'est plus disponible dans jQuery, j'ai utilisé ici $.toJSON de ce plugin : code.google.com/p/jquery-json

19voto

redsquare Points 47518

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

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

11voto

rpcutts Points 351

Remplacer

data: { patientID: "1" },

avec

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

Pour en savoir plus : 3 erreurs à éviter lors de l'utilisation de jQuery avec ASP.NET

2 votes

Ne faudrait-il pas que ce soit quelque chose comme data : '{ patientID : "1" }', pour éviter les guillemets imbriqués ?

0 votes

Pas de réponse. La valeur est nulle dans la méthode d'action avec ce changement.

0 votes

Essayez de supprimer le paramètre contentType que vous avez spécifié

6voto

Vivek Points 21

Il y a beaucoup de confusion dans certaines des fonctions de jquery comme $.ajax, $.get, $.post, $.getScript, $.getJSON. Quelle est la différence entre elles, quelle est la meilleure, quelle est la plus rapide, laquelle utiliser et quand, alors ci-dessous est la description de ces fonctions pour les rendre claires et se débarrasser de ce type de confusions.

La fonction $.getJSON() est une fonction Ajax raccourcie (utiliser en interne $.get() avec le type de données script), qui est équivalente à l'expression ci-dessous, utilise certains critères limités comme le type de demande est GET et le type de données est json.

Lire plus jquery-post-vs-get-vs-ajax

0 votes

Quelqu'un a supprimé le lien, et cette réponse n'avait aucun sens sans lui, donc je l'ai remis en place.

4voto

kgiannakakis Points 62727

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

0 votes

J'ai essayé de changer le type en GET, et le changement de données dans la réponse de rpcutts, mais la valeur est toujours nulle dans la méthode d'action.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X