我正在尝试使用jqTree渲染可折叠树,以便使用AJAX通过ASP.NET项目显示MySQL数据库中的数据。
问题:
我可以从我的AJAX调用中成功获取包含jqTree格式化数据的字符串(即 不 JSON,即使他们说它支持它)。但是,一旦我得到它,它就会呈现为一个垂直的字符串。如果我对数据进行类型调用,它会说它是一个字符串,即使它在通过console.log进行目视检查时看起来像一个对象。
我尝试了许多不同的方法将字符串放入对象中,结果各不相同。
我在后面的代码中使用它来返回制造的字符串:
return sb.ToString();
结果字符串如下所示(注意没有包装引号):
[{label: 'PCBID: 350',children:[{label: 'TimeStamp: 04-Sep-14 10:30:23'},{label: 'User: DAVEG'},{label: 'PCBID: 350'},{label: 'Assembly Drawing: 41411'},{label: 'PCB Drawing: 10348'},{label: 'Vendor: SBE'},{label: 'PO Number: 98019'}]},{label: 'Serial Number: Not Assigned'},{label: 'Assembly Drawing: 41411'},{label: 'Last Test Result: None Found'}]
在我的div中会像这样呈现:
[
{
l
a
b
e
l
:
'
P
C
B
I
D
...and so on...
我知道这些是由jqTree呈现的,因为我可以拖动&放下它们,点击它们时会突出显示等等,但不是树形视图,而是一个“悬挂的藤蔓”视图,并不完全有用。
如果我只是采用相同的完全相同的字符串并在JS中将其声明为var(不使用message.d的返回值):
var data = [{label: 'PCBID: 350',children:[{label: 'TimeStamp: 04-Sep-14 10:30:23'},{label: 'User: DAVEG'},{label: 'PCBID: 350'},{label: 'Assembly Drawing: 41411'},{label: 'PCB Drawing: 10348'},{label: 'Vendor: SBE'},{label: 'PO Number: 98019'}]},{label: 'Serial Number: Not Assigned'},{label: 'Assembly Drawing: 41411'},{label: 'Last Test Result: None Found'}]
在我的JS代码和&使用它,它显示完美,typeof认为它是一个对象。
工作示例,以便您可以看到我在寻找的内容:
JS方面的代码:
这是我的AJAX调用的Success部分,其中有一些注释掉的版本也不起作用:
success: function (message)
{
console.log("SUCCESS: Inside processEvent AJAX success call");
console.log(message.d);
console.log(typeof message);
console.log(typeof message.d);
var data = message.d;
//this method works, but not very useful as it's hard coded:
//var data = [{ label: 'PCBID: 350', children: [{ label: 'TimeStamp: 04-Sep-14 10:30:23' }, { label: 'User: DAVEG' }, { label: 'PCBID: 350' }, { label: 'Assembly Drawing: 41411' }, { label: 'PCB Drawing: 10348' }, { label: 'Vendor: SBE' }, { label: 'PO Number: 98019' }] }, { label: 'Serial Number: Not Assigned' }, { label: 'Assembly Drawing: 41411' }, { label: 'Last Test Result: None Found' }];
var data = $.getJSON(message.d);
//var data = { JSON.parse(message.d) };
//var data = ({}).valueOf.call($.parseJSON(message.d));
//var data = object.create(message.d);
console.log(typeof data);
console.log(data);
$(function ()
{
$('#tree1').tree({
data: data,
autoOpen: false,
saveState: true,
dragAndDrop: true
});
});
问题:
毕竟,我的问题是,如何从AJAX message.d中取出字符串并将其转换为对象,以便jqTree可以使用它来呈现我正在寻找的树?
工作代码:
我已经添加了一些成功的用户通知内容(jGrowl),所以不要让它扔给你。修复它的代码位于:data = eval($.parseJSON(message.d));
success: function (message)
{
console.log("SUCCESS: Inside processEvent AJAX success call");
console.log(message.d);
//if it's a non query event, do this
if (DTO.eventData.eventType != "PCBID_query")
{
$.jGrowl("\nSuccessfully inserted a " + DTO.eventData.eventType + " event into the MySQL database.",
{ header: 'SUCCESS', theme: "pcb-success", life: 10000 });
}
//if processData was used for a PCBID query, process this code
if (DTO.eventData.eventType === "PCBID_query")
{
var data = {};
data = eval($.parseJSON(message.d));
$(function ()
{
//force reload of tree data
$('#tree1').tree('loadData', data);
$('#tree1').tree({
data: data,
autoOpen: false,
saveState: true,
dragAndDrop: true
});
});
}
我知道eval
是邪恶的&提出了一个安全漏洞,但这是所有内部代码,只能在本地服务器上使用。生产地板计算机所以我认为风险是可以接受的(我的经理也是如此)。
答案 0 :(得分:1)
eval(data)
会起作用,但使用eval()
通常是一个安全问题,尤其是从公共区域获取数据时,例如用户提交的SQL数据。
最好的解决方案是寻找从ASP.NET导出JSON的真正方法。在不知道你的代码的情况下,一些谷歌搜索显示有解决方案。