2010-11-30 26 views
2

J'essaye d'obtenir le code de saisie semi-automatique de JQueryUI en travaillant avec un service Web ASMX. Je me rapproche, mais frappé encore un autre mur hier. Les données JSON sont renvoyées au format {d: "data"} (voir http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx). Mes données ressemble maintenant:JSON a renvoyé des données au format {d: "data"}

d: "[{"DOTNumber":"001061010","JobTitle":"Project Architect"},{"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]" 

Mon code est:

$(function() { 
    function log(message) { 
     $("<div/").text(message).prependTo("#log"); 
     $("#log").attr("scrollTop", 0); 
    } 
}); 

$("#dotmatch").autocomplete({ 
    source: function(request, response) { 
     $.ajax({ 
      type: "POST", 
      url: "/AutoSuggestJSTest/AutoSuggest.asmx/DOTFind", 
      contentType: 'application/json', 
      dataType: "json", 
      data: JSON.stringify({ prefixText: request.term, count: 20 }), 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert(textStatus); 
      }, 
      success: function(data) { 
       var safe = data; 
       response($.map(safe.d, function(item) { 
        return { 
         label: item.JobTitle + "(" + item.DOTNumber + ")", 
         value: item.DOTNumber 
        } 
       })); 
      } 
     }); 
    }, 
    minLength: 2, 
    select: function(event, ui) { 
     log(ui.item ? 
       "Selected: " + ui.item.value + " aka " + ui.item.id : 
       "Nothing selected, input was " + this.value); 
     $get("DOTNumber").value = ui.item.value; 
    }, 
}); 

Le problème réside dans la fonction de réussite.

Quelle est la bonne syntaxe pour passer le "d" problème?

+0

De la version que je regarde, l'ajax est géré dans la fonction de saisie semi-automatique. Utilisation: saisie semi-automatique (url ou data, [options]) http://docs.jquery.com/Plugins/Autocomplete/autocomplete#url_or_dataoptions – wajiw

+0

J'ai vu des dizaines d'articles sur ce problème et le code fonctionne, mais les données JSON sont être enveloppé comme je l'ai décrit. Voir le lien vers haacked.com. –

Répondre

2

Vos données devraient ressembler à ceci:

{"d":[{"DOTNumber":"001061010","JobTitle":"Project Architect"},"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]} 

Il semble qu'il vous manque des guillemets autour de votre "d" et vous avez des guillemets supplémentaires autour de votre tableau. Ne pas eval() vos données - cela vous ouvre à plus de problèmes de sécurité que le d: prevent .. Vous devriez avoir accès à JSON.parse() ou sinon jQuery.parseJSON() (qui enveloppe JSON.parse() si disponible ... dépend de votre plate-forme (s) cible (s)). Etes-vous sûr d'utiliser la saisie semi-automatique correctement?

+1

Merci. jQuery.parseJSON (data.d) fonctionne. Étoile d'or! –

0

Cela a été un processus incroyablement difficile, mais j'ai finalement réussi à le faire fonctionner. Il y avait un certain nombre d'obstacles: 1) Ma chaîne de retour JSON était enveloppée dans une couverture XML, donc elle n'analysait pas 2) Résoudre ce problème nécessitait le type contentType: 'application/json' 3) Avec ce type de contenu , un POST était requis. GET ne fonctionnerait pas 4) POST requis de mettre les données ensemble en utilisant le JSON.stringify. Je ne suis pas encore sûr de celui-ci, mais j'ai trouvé du code quelque part qui l'a fait. 5) Les données provenant du POST étaient précédées d'un "d" (voir: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) 6) l'accès aux données lui-même nécessitait la ligne "eval (data.d)".

$("#dotmatch").autocomplete({ 
     source: function(request, response) { 
      $.ajax({ 
       type: "POST", 
       url: "/AutoSuggestJSTest/AutoSuggest.asmx/DOTFind", 
       contentType: 'application/json', 
       dataType: "json", 
       data: JSON.stringify({ prefixText: request.term, count: 20 }), 
       success: function(data) { 
        var output = eval(data.d); 
        response($.map(output, function(item) { 
         return { 
          label: item.JobTitle + "(" + item.DOTNumber + ")", 
          value: item.DOTNumber 
         } 
        })); 
       }, 
       error: function(XMLHttpRequest, textStatus, errorThrown) { 
        alert(textStatus); 
       } 
      }); 
     }, 
     minLength: 2 
    }); 

Si j'ai jamais tant de mal à écrire quelques lignes de code à nouveau, je vais prendre un fusil de chasse de calibre très grand à mon ordinateur!

Bob Jones

0

Si vous utilisez un service WCF JSON avec le WebHttpBehavior (au lieu de enableWebScriptBehavior), il ne sera pas émettre le "d"

+0

J'ai essayé d'utiliser WCF mais je l'ai trouvé trop nerveux et difficile à configurer, donc je suis revenu aux services Web ASMX traditionnels. Quelle est la cause du "d" est. NET essayant de protéger les données retournées. –