2010-09-10 2 views
1

В настоящее время я использую AJAX Handler для заполнения JSTree:ASP.net/jQuery: JSTree, выбирая узел, кажется, не может получить ID

$(function() { 
     $("#jstree").jstree({ 
      "json_data": { 
       "ajax": { 
        "url": "AJAXHandler.aspx?action=GetMenu" 
       } 
      }, 
      "plugins": ["themes", "json_data", "dnd"] 
     }) 
     .bind("move_node.jstree", function (node, ref, position, is_copy, is_prepared, skip_check) { 
      console.log(node); }); 

    }); 

обработчик на самом деле делает вызов базы данных, перебирает пункты меню, создает объект JSON, который сериализованная, отправляется обратно, и оказал:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Select Case Request("action") 
      Case "GetMenu" 
       GetMasterMenu() 
      Case "UpdateMenuHiearchy" 
       UpdateMenuHiearchy() 
     End Select 
    End Sub 

    Private Sub GetMasterMenu() 
     Dim dt As DataTable = GetMenu() 
     Dim nodesList As New List(Of JsTreeNode)() 
     PopulateNodes(dt, nodesList) 
     Dim ser As New JavaScriptSerializer() 
     Dim res As String = ser.Serialize(nodesList) 
     Response.ContentType = "application/json" 
     Response.Write(res) 
     Response.[End]() 
    End Sub 

    Private Sub PopulateNodes(ByRef dt As DataTable, ByVal nodes As List(Of JsTreeNode)) 

     Dim parents() As DataRow = dt.Select("PARENT_MENU_ID = 0") 

     'Root Nodes 
     For Each dr As DataRow In parents 
      Dim node As New JsTreeNode() 
      node.attributes = New Attributes() 
      node.attributes.id = dr("APPLICATION_MENU_ID").ToString 
      node.attributes.rel = "root" & dr("APPLICATION_MENU_ID").ToString 
      node.data = New Data() 
      node.data.title = dr("DESCRIPTION") 
      node.state = "open" 

      'Check for Children 
      Dim strSQL As New StringBuilder 
      With strSQL 
       .Append(" SELECT * FROM APPLICATION_MENU WHERE PARENT_MENU_ID = " & dr("APPLICATION_MENU_ID") & "") 
      End With 

      Dim dtChildren As DataTable = DatabaseManager.Query(strSQL.ToString) 
      If dtChildren.Rows.Count > 0 And dtChildren IsNot Nothing Then 
       For Each drChild As DataRow In dtChildren.Rows 
        AddChildNodes(dt, dr("APPLICATION_MENU_ID"), node) 
       Next 
      End If 
      node.attributes.mdata = "{draggable : true}" 
      nodes.Add(node) 
     Next 
    End Sub 

    Private Sub AddChildNodes(ByRef dt As DataTable, ByVal parentID As Integer, ByVal node As JsTreeNode) 
     Dim strSQL As New StringBuilder 
     With strSQL 
      .Append(" SELECT * FROM APPLICATION_MENU WHERE PARENT_MENU_ID = " & parentID.ToString & "") 
     End With 
     Dim dtChildren As DataTable = DatabaseManager.Query(strSQL.ToString) 
     node.children = New List(Of JsTreeNode)() 

     For Each drChild As DataRow In dtChildren.Rows 
      Dim cnode As New JsTreeNode() 
      cnode.attributes = New Attributes() 
      cnode.attributes.id = drChild("APPLICATION_MENU_ID").ToString 
      node.attributes.rel = "folder" 
      cnode.data = New Data() 
      cnode.data.title = drChild("DESCRIPTION") 
      cnode.attributes.mdata = "{draggable : true }" 

      strSQL = New StringBuilder 
      With strSQL 
       .Append(" SELECT * FROM APPLICATION_MENU WHERE PARENT_MENU_ID = " & drChild("APPLICATION_MENU_ID") & "") 
      End With 

      Dim dtChildren2 As DataTable = DatabaseManager.Query(strSQL.ToString) 
      If dtChildren.Rows.Count > 0 And dtChildren IsNot Nothing Then 
       AddChildNodes(dt, drChild("APPLICATION_MENU_ID"), cnode) 
      End If 
      node.children.Add(cnode) 
     Next 
    End Sub 

идея заключается в том, чтобы связать move_node с функцией, которая ударит обработчик и обновления базы данных, куда Я переместил объект. Я смог создать привязку, чтобы сделать это. Проблема, однако, в том, что я не могу получить идентификатор. Я устанавливаю его в атрибутах в совокупности объекта JSON, но когда я просматриваю объекты NODE и REF через console.log, поле id пусто.

Что дает? Есть идеи? Не хватает ли чего-то жизненно важного?

ответ

1

После еще раз возился с ней, я нашел ответ:

cnode.attributes 
node.attributes 

Необходимо назвать конкретные внизу, они должны быть cnode.attr и node.attr работать.

0

Вы действительно правиль-

JSTree V1 + использует JQuery привязки и т.д .. Таким образом, вы должны использовать Attr для получения объектов атрибутов - также на стороне записки, IE7- чувствительны к регистру с узлом данные, например:

$("#node").attr("id")!=$("#node").attr("ID")