You need to enable JavaScript to run this app. jQuery AJAX传含DevExpress多选值的多参数时JSON序列化报循环结构错误
优惠活动
大模型
产品
解决方案
定价
更多

jQuery AJAX传含DevExpress多选值的多参数时JSON序列化报循环结构错误

报错根源定位

这个Uncaught TypeError: Converting circular structure to JSON错误和“普通文本+数组”的混合参数类型完全无关,本质是DevExpress控件客户端返回的选中项对象自带循环引用属性,无法被原生JSON.stringify序列化。
补充说明:ASPxListBox.GetSelectedItems()返回的不是纯值集合,是DevExpress封装的客户端Item对象,内部持有指向父控件实例、事件回调绑定的引用链,存在循环嵌套关系。哪怕返回的数组长度和实际选中项数量完全匹配,序列化过程遍历到这些内部引用时就会直接抛出异常。你之前尝试直接传递选中项返回值、手动封装对象数组的操作之所以失败,核心原因是过程中嵌入了带引用链的DevExpress封装对象,而非参数类型的问题。

正确实现步骤
  • 第一步:提取纯值,不要直接传递控件返回的选中项对象
    不要将GetSelectedItems()的返回值直接作为参数,需要从每个选中项中提取纯文本/数字值,组成无引用的原生数组。可直接使用DevExpress内置的GetSelectedValues()方法一步拿到纯值集合,也可以手动遍历提取:
    // 方式1:用控件内置方法直接获取纯值数组
    const selectedLocationCodes = checkListBox.GetSelectedValues();
    
    // 方式2:手动遍历选中项提取值(兼容低版本控件)
    const selectedLocationCodes = checkListBox.GetSelectedItems().map(item => item.value);
    
  • 第二步:构造无引用的请求参数对象
    将普通文本参数和提取完成的纯数组一起放入参数对象,全程不要混入控件实例、控件原生Item对象:
    const requestParams = {
      // 普通文本参数正常定义即可
      updateAction: "bulk_update",
      operatorId: "user_123",
      // 传入提取完成的纯数组,而非控件原始返回值
      LocationCode: selectedLocationCodes,
      remark: "批量更新PlantCode映射关系"
    };
    
  • 第三步:发起jQuery AJAX请求
    实际上jQuery会自动对传入data字段的对象做序列化处理,不需要手动调用JSON.stringify,只要保证传入的是上面构造的纯参数对象即可:
    $.ajax({
      url: "/api/plant/update",
      type: "POST",
      data: requestParams,
      success: (response) => {
        console.log("请求成功", response);
      },
      error: (err) => {
        console.error("请求失败", err);
      }
    });
    
常见踩坑说明
  • 不要在参数对象中混入DevExpress控件的客户端实例(比如checkListBox本身),这类对象内部包含大量循环引用属性,触发序列化报错是必然结果。
  • 手动封装对象数组时,不要直接把Item对象作为数组元素,只需要提取Item对应的value、text这类基础字段即可。
  • 如果需要传递JSON格式的请求体,可在AJAX配置中加上contentType: "application/json",并对构造好的纯参数对象调用JSON.stringify,因为此时参数内已经没有循环引用,不会再触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 04:15:03