You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Ajax加载数据至jstree无显示,请求排查代码问题

问题分析与解决方案

你遇到的问题主要出在JSON数据的重复序列化以及jstree初始化/刷新的逻辑顺序上,我来帮你一步步排查修复:

1. 核心问题:后端重复序列化JSON

你的后端代码里犯了一个典型错误:先用JsonConvert.SerializeObject(nodes)把节点数据转成了JSON字符串,然后又用Json()方法返回——而Json()本身会自动对传入的对象做序列化处理。这就导致前端拿到的json.jsonvar是一个JSON格式的字符串,而不是jstree需要的JavaScript对象数组。

jstree的core.data要求传入可直接解析的对象/数组,而非字符串,所以即使alert能显示内容,树也无法识别并渲染。

修复后端代码:

去掉多余的手动序列化,直接返回nodes对象:

[HttpPost]
public IActionResult LoadChartList(int id) {
 // 生成nodes的业务逻辑
 return Json(new { jsonvar = nodes }); // 由Json()方法自动完成序列化
}

2. 前端逻辑优化:避免重复初始化+修正执行顺序

原前端代码还有两个小问题:

  • reload_chart里嵌套了$(function () {}),完全没必要——按钮点击事件本身就是在DOM加载完成后触发的,嵌套会导致ajax逻辑延迟执行。
  • 每次点击按钮都重新创建jstree实例,再调用refresh,这会导致实例冲突,反而无法正确渲染。

修复前端代码:

调整逻辑,判断树是否已初始化,已初始化则更新数据并刷新,未初始化则创建实例:

function reload_chart() {
  $.ajax({
    async: true,
    type: "Post",
    url: "/Controller/Action?id=3",
    dataType: "json",
    success: function (json) {
      var treeElement = $('#jstreeChart');
      var treeInstance = treeElement.jstree(true);
      
      if (treeInstance) {
        // 树已存在,更新数据并刷新
        treeInstance.settings.core.data = json.jsonvar;
        treeInstance.refresh();
      } else {
        // 树未初始化,创建新实例
        createJSTrees(json.jsonvar);
      }
    }
  });
}

function createJSTrees(jsonparams) {
  $('#jstreeChart').jstree({
    "core": {
      "themes": {
        "variant": "large"
      },
      "data": jsonparams
    },
    "checkbox": {
      "keep_selected_style": false
    }
  });
}

验证小技巧

如果想确认前端拿到的是对象还是字符串,可以在success回调里加一行调试代码:

console.log(typeof json.jsonvar);

如果输出是string,说明后端序列化重复了;正常应该输出object(数组也属于object类型)。

内容的提问来源于stack exchange,提问作者topcool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:52:35