我试图让JQueryUI的自动完成代码与ASMX Web服务一起使用。我越来越近了,但是昨天打了另一面墙。 JSON数据以{d:“data”}格式返回(请参阅http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)。我的数据现在看起来像:
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 :(得分:2)
您的数据应如下所示:
{"d":[{"DOTNumber":"001061010","JobTitle":"Project Architect"},"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]}
看来你的“d”周围缺少引号,你的数组周围有额外的引号。
不要eval()您的数据 - 这会让您面临更多安全问题而不是d:阻止..您应该有权访问JSON.parse()或者如果不是jQuery.parseJSON()(它包含JSON。 parse()如果可用...取决于您的目标平台)。
答案 1 :(得分: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
});
如果我再次编写几行代码时会遇到这么多麻烦,我将把一把非常大的霰弹枪带到我的电脑上!
Bob Jones
答案 2 :(得分:0)
如果您使用带有webHttpBehavior的WCF JSON服务(而不是enableWebScriptBehavior),它将不会发出“d”