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

为何$.ajax调用WebMethod返回带d属性JSON,C#序列化却无致RenderCourses失败?

为什么jQuery调用WebMethod返回的JSON带d属性,而JsonConvert序列化的没有?

这个问题其实是ASP.NET WebMethod的默认行为和Json.NET序列化逻辑的差异导致的,我来给你拆解清楚:

1. ASP.NET WebMethod的d属性是怎么来的?

这是ASP.NET框架为了安全防护特意做的设计——早期存在JSON劫持攻击风险,恶意页面可能构造请求获取敏感数据,ASP.NET通过把WebMethod的返回值自动包裹在d属性里,来规避这类风险。当你用$.ajax调用WebMethod时,ASP.NET的服务端处理程序会自动把你实际要返回的数据塞进d字段,所以前端代码里必须取data.d才能拿到真实数据。

2. JsonConvert.SerializeObject为什么没有d?

Json.NET(也就是你用的JsonConvert)是通用的JSON序列化库,它的原则是严格序列化你传入的对象本身,不会额外添加任何框架层面的包装字段。你给它传什么对象,它就输出对应结构的JSON,自然不会有外层的d属性。

3. 为什么调用RenderCourses会失败?

你的RenderCourses函数里写了判断data.d.length,但现在通过后端注册脚本传入的data是没有d属性的,这时候data.d就是undefined,访问undefined.length会直接抛出JavaScript错误,导致整个函数执行失败。

解决办法(二选一即可)

  • 前端兼容:修改RenderCourses函数,先判断d属性是否存在:
    function RenderCourses(data) {
      const realData = data.d || data;
      if (realData.length > 0) {
        // 你的原有业务逻辑
      }
    }
    
  • 后端包装:序列化的时候手动给数据包一层d属性:
    var wrappedData = new { d = yourOriginalData };
    string json = JsonConvert.SerializeObject(wrappedData);
    
    这样生成的JSON就和WebMethod返回的结构一致了,前端代码不用做任何修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:29