为何$.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属性:
这样生成的JSON就和WebMethod返回的结构一致了,前端代码不用做任何修改。var wrappedData = new { d = yourOriginalData }; string json = JsonConvert.SerializeObject(wrappedData);
内容的提问来源于stack exchange,提问作者Kiquenet
相关产品推荐
相关产品推荐

