2014-09-05 5 views
0

jqTree를 사용하여 AJAX를 사용하는 ASP.NET 프로젝트를 통해 MySQL 데이터베이스의 데이터를 표시 할 수있는 축소 가능한 트리를 렌더링하려고합니다.jqTree에서 사용하기 위해 문자열을 Javascript로 변환하십시오.

문제점 :

내가 성공적으로 jqTree 형식의 데이터가 포함 된 문자열을 얻을 수 있습니다 (인하지 JSON 그들이 그것을 지원하는 말에도 불구하고) 다시 내 AJAX 호출에서. 그러나 일단 거기에 도착하면 문자의 세로 문자열로 렌더링됩니다. 데이터에 대해 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... 

나는 이것이 jqTr 왜냐하면 나는 &을 끌어다 놓을 수 있기 때문에 클릭했을 때 강조 표시되지만 트리보기 대신에 "매달린 포도 나무"보기가 유용하지는 않습니다. 단순히 같은 동일한 문자열을하고 JS 내부 VAR (message.d의 반환 값을 사용하지 않는)로 선언하는 경우

:

내 JS 코드 내부
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'}] 

& 사용하는, 그것을 완벽하게 표시되고 typeof는 그것이 객체라고 생각합니다.

작업 예 그래서 당신은 내가 무엇을 찾고 볼 수 있습니다

여기 내 AJAX 호출의 성공 부분과가있다 :

JSFiddle

JS 측의 코드 어떤 것도 작동하지 않는 주석 처리 된 버전이 많이 있습니다.

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

'eval (data)'이이 경우 작동하지만 보안상의 문제입니다. 가장 좋은 해결책은 ASP.NET에서 JSON을 내보내는 실제 방법을 찾는 것입니다. 당신의 코드를 알지 못하면, 거기에 해결책이 있다는 것을 약간의 인터넷 검색이 보여줍니다. –

+0

'return Newtonsoft.Json.JsonConvert.SerializeObject (sb.ToString(), Newtonsoft.Json.Formatting.Indented); '를 사용하여 데이터를 JSON으로 내보내려고했으나 구문 분석 할 때 같은 결과가 나타납니다. JS 측. 이것은 누군가에 의해 외부 적으로 사용되지 않을 것이므로 보안 문제는 아마도 부적절 할 수 있습니다. 나는 당신에게 제안을 시도 할 것이다 (비록 내가 eval을 사용하는 몇 가지 다른 방법을 시도했지만 예제에 포함하지 않았다). – delliottg

+0

그 덕분에, 고마워! 'eval'을 사용하지 않는 다른 방법이 있습니까? 어떤 경우이든 내부 전용 도구이기 때문에 보안 문제가 지나치게 걱정되지는 않습니다. 빠른 답변을 작성하려면 선택하겠습니다. BTW, getJSON을 사용하여 삭제하기 전에 원래 응답을 보았습니다. & 시도했지만 작동하지 않았습니다. 다시 한 번 감사드립니다. – delliottg

답변

1

eval(data)이 경우에는 작동하지만 eval()은 일반적으로 사용자가 제출 한 SQL 데이터와 같은 공용 영역에서 데이터를 가져 오는 경우 보안 문제입니다.

최상의 솔루션은 ASP.NET에서 JSON을 내보내는 실제 방법을 찾는 것입니다. 당신의 코드를 알지 못하면, 거기에 해결책이 있다는 것을 약간의 인터넷 검색이 보여줍니다.

+0

보안이 문제는 내부 전용 도구입니다. 도움을 주셔서 감사합니다. 감사드립니다. – delliottg