0

我正在尝试使用 jqTree 呈现可折叠树,以通过使用 AJAX 的 ASP.NET 项目显示来自 MySQL 数据库的数据。

问题:

我可以从我的 AJAX 调用中成功获取包含 jqTree 格式数据的字符串(即使他们说它支持它也不是 JSON)。但是,一旦我得到它,它就会呈现为垂直字符串。如果我对数据进行 typeof 调用,它会说它是一个字符串,即使它在通过 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 认为它是一个对象。

工作示例,以便您可以看到我在寻找什么:

JSFiddle

JS端的代码:

这是我的 AJAX 调用的成功部分,其中包含一堆也不起作用的注释掉的版本:

    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是邪恶的并且存在安全漏洞,但是,这是所有内部代码,只能在本地服务器和生产车间计算机上使用,所以我认为风险是可以接受的(我的经理也是如此)。

4

1 回答 1

1

eval(data)在这种情况下会起作用,但使用eval()通常是一个安全问题,尤其是在从公共区域获取数据时,例如用户提交的 SQL 数据。

最好的解决方案是寻找一种从 ASP.NET 中导出 JSON 的真正方法。在不知道您的代码的情况下,通过谷歌搜索显示有解决方案。

于 2014-09-05T18:13:44.827 回答