2010-11-30 185 views
2

我正在尝试使用ASMX Web服务来获取JQueryUI的自动完成代码。我正在接近,但昨天再次撞墙。 JSON数据以{d:“data”}格式返回(请参阅http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)。我的数据现在看起来像:JSON返回的数据是{d:“data”}格式

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

我的代码是:

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

问题在于成功的功能。

通过“d”问题的正确语法是什么?

+0

您确定您使用的是正确的自动填充吗?从我看的版本来看,ajax是在自动完成功能中处理的。用法:自动完成(网址或数据,[选项])http://docs.jquery.com/Plugins/Autocomplete/autocomplete#url_or_dataoptions – wajiw 2010-11-30 17:06:37

+0

我已经看到了几十篇关于这个问题的文章,并且代码确实有效,但是JSON数据是正如我所描述的那样包裹。请参阅haacked.com的链接。 – 2010-11-30 17:15:49

回答

2

你的数据应该是这样的:

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

看起来您缺少“d”引号,并且您的数组周围还有多余的引号。你可以访问JSON.parse()或者如果没有的话,可以使用jQuery.parseJSON()(它包装了JSON.parse()方法)。不要eval()你的数据 - 这会打开你的安全问题,而不是d:如果可用......取决于您的目标平台)。

0

这是一个非常困难的过程,但我终于搞定了。有一些障碍: 1)我的JSON返回字符串被包装在XML毯子中,所以它不会解析 2)解决此问题需要contentType:'application/json'行 3)使用该内容类型,需要POST。 GET不起作用 4)POST需要使用JSON.stringify将数据放在一起。我仍然不确定这个,但是我发现了一些代码。 5)从POST返回的数据前缀为“d”(请参阅​​:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) 6)访问数据本身需要“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 
    }); 

如果我有这么多的麻烦又来写的几行代码,我要带一个非常大有瓜葛猎枪到我的电脑!

鲍勃·琼斯

0

如果您使用的webHttpBehavior(而不是enableWebScriptBehavior)一个WCF JSON服务,也不会发出 “d”

+0

我尝试过使用WCF,但发现它太刺激,难以配置,所以我回到了传统的ASMX Web服务。什么导致“d”是.NET试图保护返回的数据。 – 2010-12-02 18:21:23