2011-02-03 4 views
0

J'essaie le nouveau jQuery 1.5 et il a cassé quelques choses dans mon application. Je fais un appel à une action qui génère le JSON, mais quelque chose commet une erreur et provoque l'arrêt du script. Selon Fiddler et Firebug, l'action renvoie des données JSON. Je n'ai pas fourni les données JSON, mais les données sont valides selon JSONLint.

Veuillez noter que cela fonctionne comme prévu dans jQuery 1.4.4.

La première chose que j'ai remarqué était l'URL: http://localhost:3219/News/GetAllNewsArchives?callback=jQuery15033185029088076134_1296751219270&_=1296751219672

Script:

// Dropdown box for past articles 
$("#article-select").ready(function() { 
    $.ajaxSetup({ cache: false }); 
    $.getJSON('/News/GetAllNewsArchives', null, function(json) { 
     var items = "<option value=''>(Select)</option>"; 
     $.each(json, function(i, item) { 
      items += "<option value='" + item.Id + "'>" + subject + "</option>"; 
     }); 
     $("#article-select").html(items); 
    }); 
}); 

Action:

public ActionResult GetAllNewsArchives() 
    { 
     return Json(newsRepository.GetAllNewsArchives(), JsonRequestBehavior.AllowGet); 
    } 

Toute idée de ce que je fais mal?

Répondre

3

D'accord, je suis passé à un appel .ajax $ et j'ai eu la même erreur:

// Dropdown box for past articles 
$("#article-select").ready(function() { 
    $.ajax({ 
     cache: false, 
     type: "POST", 
     dataType: "json", 
     url: "/News/GetAllNewsArchives", 
     success: function(json) { 
      var items = "<option value=''>(Select)</option>"; 
      $.each(json, function(i, item) { 
       items += "<option value='" + item.Id + "'>" + subject + "</option>"; 
      }); 
      $("#article-select").html(items); 
     } 
    }); 

Cependant, je remarquais quelque chose sur le $.ajax() documentation.

As of jQuery 1.5, jQuery can convert a dataType from what it received in the Content-Type header to what you require. For example, if you want a text response to be treated as XML, use "text xml" for the dataType. You can also make a JSONP request, have it received as text, and interpreted by jQuery as XML: "jsonp text xml." Similarly, a shorthand string such as "jsonp xml" will first attempt to convert from jsonp to xml, and, failing that, convert from jsonp to text, and then from text to xml.

j'ai changé mon type de données dataType: "json"-dataType: "text json" il a travaillé.

Maintenant, je ne comprends pas pourquoi la différence. Qu'est-ce que json attend de ce qui est différent?

+2

Trouvé un bug confirmé signalé dans les [forums jQuery.com] (https://forum.jquery.com/topic/getjson-and-jquery-1-5). [Voir patch] (https://github.com/jzaefferer/jquery-validation/issues#issue/36). –

0

Pour une raison quelconque, il interprète votre demande comme JSONP. Dans Firebug, inspectez la valeur de $ .ajaxSettings et assurez-vous que quelque chose ne soit pas par défaut son dataType à jsonp.

Avez-vous essayé d'utiliser $.ajax() directement, pour définir explicitement la demande type, dataType, etc?

+0

Ce fut ma prochaine étape. Mais nous n'étions pas sûrs si nous n'obtiendrions pas le même résultat. Je vais essayer et afficher les résultats. –

0

Quel est le type de contenu dans la réponse? Ce n'est pas ce que vous demandez, ou spécifiez sur le paramètre dataType parm, mais qu'est-ce que le serveur renvoie comme type de contenu de la réponse (de fiddler)

+0

'Content-Type: application/json; charset = utf-8' –

2

Dans jquery 1.5 code source c'est le code qui détecte le contenu type. Si vous définissez dataType sur "json", le code précédent laissera ct indéfini. C'est pourquoi cela ne fonctionne pas comme prévu. C'est un problème dans jQuery 1.5, car il rompt la compatibilité avec les versions précédentes de jQuery.

Vous devez donc définir dataType sur "text json" ou supprimer dataType afin que la valeur par défaut soit utilisée.

par défaut:

converters: { 

     // Convert anything to text 
     "* text": window.String, 

     // Text to html (true = no transformation) 
     "text html": true, 

     // Evaluate text as a json expression 
     "text json": jQuery.parseJSON, 

     // Parse text as xml 
     "text xml": jQuery.parseXML 
    } 
+0

Comment faire cela sur la méthode $ .getJSON? Ou comment envoyer le type de contenu approprié? –

+0

Il a été corrigé dans la dernière version de jQuery 1.5.2 – Softlion