2013-09-25 2 views
0

У меня есть следующий код JavaScript, на мой взгляд, чтобы построить TreeView и получать данные с сервера:MVC4 JsTree Передача выбранного узла к контроллеру

$(function() { 

    $("#EquipmentTree").jstree({ 

     "json_data": { 
      "ajax": { 
       "url": "/Helper/GetEquipTreeViewData", 
       "type": "POST", 
       "data": function() {$("#EquipmentTree").jstree('get_selected').attr('id');}, 
       "dataType": "json", 
       "contentType": "application/json charset=utf-8" 
      } 
     }, 

     "themes": { 
      "theme": "default", 
      "dots": true, 
      "icons": true, 
      "url": "Scripts/jstree-v.pre1.0/themes/default/style.css" 
     }, 

     "plugins": ["themes", "json_data"], 

     "core": { "animation": 100 } 
    }); 
}); 

Мой контроллер имеет:

public ActionResult GetEquipTreeViewData(string nodeId) 

    { 
     do some stuff 

     return Json (data); 

    } 

Everthing работает отлично, за исключением что я никогда не получаю выбранный узел. Я всегда получаю NULL в nodeId. Даже если я перейду к:

"data": { nodeId : "TEST" } 

У меня все еще есть ошибка или ошибка Javascript. Это превращает меня в орехи. Я также пробовал:

"data" : JSON.stringfy(nodeId); 

И продолжить отправлять null.

Предполагается, что это обычный вызов AJAX, но это не так. Мне просто нужно передать выбранный treenode на контроллер, чтобы перезагрузить страницу результатов на основе выбора пользователя.

Спасибо за помощь.

[EDIT] Мои результаты по вариантам тестирования:

TEST1:

var selected_node = $("#EquipmentTree").jstree('get_selected').attr('id'); 
    $("#EquipmentTree").jstree({ 

     "json_data": { 
      "ajax": { 
       "url": "/Helper/GetEquipTreeViewData", 
       "type": "POST", 
       "data": { nodeId : selected_node }, 
       "dataType": "json", 
       "contentType": "application/json; charset=utf-8" 
      } 
     }, 

     "themes": { 
      "theme": "default", 
      "dots": true, 
      "icons": true, 
      "url": "Scripts/jstree-v.pre1.0/themes/default/style.css" 
     }, 

     "plugins": ["themes", "json_data"], 

     "core": { "animation": 100 } 
    }); 
}); 

Ошибка в браузере: Invalid Джейсон Примитивный: NodeId

[TEST2]

Код:

$(function() { 

     var selected_node = $("#EquipmentTree").jstree('get_selected').attr('id'); 
     $("#EquipmentTree").jstree({ 

      "json_data": { 
       "ajax": { 
        "url": "/Helper/GetEquipTreeViewData", 
        "type": "POST", 
//     "data": { nodeId : selected_node }, 
        "data": JSON.stringify ("nodeId : " + selected_node), 
        "dataType": "json", 
        "contentType": "application/json; charset=utf-8" 
       } 
      }, 

      "themes": { 
       "theme": "default", 
       "dots": true, 
       "icons": true, 
       "url": "Scripts/jstree-v.pre1.0/themes/default/style.css" 
      }, 

      "plugins": ["themes", "json_data"], 

      "core": { "animation": 100 } 
     }); 
    }); 

Вызывается функция на контроллере, но получен null. Данные обозревателя:

Request URL:http://localhost:7767/Helper/GetEquipTreeViewData 
Request Method:POST 
Status Code:200 OK 
Request Headersview parsed 
POST /Helper/GetEquipTreeViewData HTTP/1.1 
Host: localhost:7767 
Connection: keep-alive 
Content-Length: 24 
Accept: application/json, text/javascript, */*; q=0.01 
Origin: http://localhost:7767 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 
Content-Type: application/json; charset=UTF-8 
Referer: http://localhost:7767/MasterDataAdminEquipment 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: ASP.NET_SessionId=yuf1omlottf0xb4aklvfr4wg 

Request Payload view source 
nodeId : EquipmentTree 
No Properties 

Устранить, что у него есть полезная нагрузка запроса с помощью «Без свойств». Обычно мы имели бы данные формы со словарем пар «Параметр» и «Ценность» .... Это n-я комбинация, которую я пытаюсь. Очень странно ...

ответ

1

В моем коде я использую:

"contentType": "application/json; charset=utf-8" 

(Обратите внимание, что ';')

Помимо этого, когда ajax call возвращает, вы должны вернуть ответ в формате JSON: вы пытались его проверить с помощью инструментов Chrome Developer? Получаете ли вы ответ?

И последнее, но не менее важное: если вы получите правильный ответ, ни один узел не будет выбран по умолчанию, поэтому запрос get_selected вернет undefined.

+0

Пожалуйста, проверьте мои EDIT1 и EDIT2 выше. – Mendes

1

Попробуйте вместо этого:

public JsonResult GetEquipTreeViewData(string nodeId) 

    { 
     do some stuff 

     return Json (data, JsonRequestBehavior.DenyGet); 

    } 
+0

Проблема не в передаче данных с контроллера для просмотра. Проблема заключается в передаче данных из представления в контроллер. Но это действительно ошибка. Я еще не понял этого момента, поскольку я все еще пытаюсь получить данные из вызова Ajax View. – Mendes

+0

Откройте консоль (f12 почти во всех браузерах) и проверьте вкладку «Сеть», если есть какая-либо ошибка. – Misters

+0

Проверьте мой EDIT1 и специально EDIT2 на исходном сообщении ... – Mendes

0

OK.Вот как я решил ее (на самом деле я изменил способ передачи данных для просмотра):

$(function() { 

     var selected_node = $("#EquipmentTree").jstree('get_selected').attr('id'); 
     var link = '@Url.Action("GetEquipTreeViewData", "Helper", new { nodeId = "-1" })'; 
     link = link.replace("-1", selected_node); 

     $("#EquipmentTree").jstree({ 

      "json_data": { 
       "ajax": { 
        "url": link, 
        "type": "POST", 
        "dataType": "json", 
        "contentType": "application/json; charset=utf-8" 
       } 
      }, 

      "themes": { 
       "theme": "default", 
       "dots": true, 
       "icons": true, 
       "url": "Scripts/jstree-v.pre1.0/themes/default/style.css" 
      }, 

      "plugins": ["themes", "json_data"], 

      "core": { "animation": 100 } 
     }); 
    }); 

В основном я бросил JavaScript и пошел хелперов (that's они здесь .. Для того, чтобы помочь) .. . Javascript является хорошим и мощным, но по-прежнему не хватает средств для среды/отладки среды IDE, чтобы избежать такого рода сбоев, связанных с запятыми, полукомами и другими мелочами. Вспомните старые времена C++ (я имею в виду чистый компилятор cc, никакой IDE вообще).

Надеюсь, это поможет кому-то!

Rds!

Смежные вопросы