jsTree JSON с MVC - PullRequest
       14

jsTree JSON с MVC

0 голосов
/ 26 февраля 2011

Я провел много исследований и не могу найти ответ.Я хочу интегрировать JSTREE с MVC3.0.Вот мои настройки Javascript:

setupTree: function (treeDivId) {
    $('#' + treeDivId).jstree({
        "json_data": {
            "ajax": {
                url: CustomTree.SectorLoadUrl,
                type: "POST",
                contentType: "application/json;charset=utf-8",
                dataType: "json",
                data: function (n) {
                    return { id: n.attr ? n.attr("id") : "0" };
                },
                success: function (data, textstatus, xhr) {
                    alert(data);
                },
                error: function (xhr, textstatus, errorThrown) {
                    alert(textstatus);
                }
            }
        },
        "themes": {
            "theme": "default",
            "dots": true,
            "icons": false
        },
        "plugins": ["themes", "json_data"]

    });
}

Я также получаю данные правильно, как видно из загруженного изображения: JSON RESPONSE

Однако, следующие строки кода:

 data: function (n) {
                    return { id: n.attr ? n.attr("id") : "0" };
                },

Всегда возвращайте -1 для n.

И я получаю ошибку синтаксического анализатора на обработчике OnError в моем текстовом состоянии.

1 Ответ

5 голосов
/ 27 февраля 2011

Я собираюсь ответить на этот вопрос в надежде, что он кому-нибудь поможет.

Я потратил в общей сложности 5 часов, пытаясь понять, что происходит, и наконец добавил хак.

ИспользованиеFirebug, я заметил, что к URL добавляется обратный вызов.Когда данные были возвращены, обратный вызов не выполнялся.Я не указывал никаких обратных вызовов, так что это был первый элемент, который нужно рассмотреть.

В документации оказывается, что jquery1.5 и далее автоматически добавит обратный вызов, если будет считать, что тип данных - jsonp.Однако я явно упомянул json как тип данных, поэтому не понимаю, почему он добавил этот обратный вызов.

Вот что говорит документация jquery: «jsonp»: загрузка в блок JSON с использованием JSONP.Добавит дополнительный "? Callback =?"в конце вашего URL, чтобы указать обратный вызов.

Так что это заставило меня задуматься о том, что происходит.Также оказалось, что начиная с jquery 1.5, теперь вы можете указать несколько типов данных в вызове AJAX, и jquery автоматически попытается преобразовать.

Глубоко в документации jquery есть следующее:может преобразовать dataType из того, что он получил в заголовке Content-Type, в то, что вам нужно. "

Поэтому я просто подумал, что было бы лучше вернуть тип данных в виде текста, а затем использовать jquery для преобразования его в json,В тот момент, когда я изменил свой dataType на «text json» вместо просто «json», все волшебным образом начало работать.

Я предполагаю, что с новым jquery что-то не так с автоматическим выводом типов данных.У меня строгий срок, поэтому я больше не могу исследовать эту проблему, но если кто-то найдет ответы, пожалуйста, отправьте сообщение.

Вот мой модифицированный Javascript:

 setupTree: function (treeDivId) {
    $('#' + treeDivId).jstree({
        "json_data": {
            "ajax": {
                "url" : CustomTree.SectorLoadUrl,
                "type" : "POST",
                "dataType" : "text json",
                "contentType" : "application/json charset=utf-8",
            }
    },
    "themes": {
        "theme": "default",
        "dots": true,
        "icons": false
    },
    "plugins": ["themes", "json_data"]

});
...