AJAX获取数组值时ID返回undefined,控制器端值正常
解决AJAX获取JSON时ID返回undefined的问题
看起来你遇到的问题大概率是JSON序列化的大小写转换导致的,这在ASP.NET(Core)里很常见,我来帮你拆解原因和解决方案:
核心原因
C#里你定义的匿名类字段是ID(PascalCase命名),但默认情况下,ASP.NET的JSON序列化器(不管是System.Text.Json还是Newtonsoft.Json)会自动把PascalCase转换为camelCase(也就是小写开头的id)。而你的前端AJAX代码里应该是用item.ID去访问这个字段,自然就找不到,返回undefined了。
你可以先快速验证这个问题:打开浏览器开发者工具(按F12),切换到「Network」标签,找到GetEvents的请求,查看返回的JSON响应,你会看到ID字段的键其实是"id"而不是"ID"。
解决方案(任选其一即可)
方案1:前端调整字段名(最简单)
直接在AJAX的回调里用小写的id去访问,比如把原来的item.ID改成item.id:
// 假设你原来的遍历代码是这样的 $.each(events, function(index, item) { console.log(item.id); // 替换原来的item.ID即可正常获取值 });
方案2:后端修改序列化配置,保持PascalCase
如果你希望后端返回的JSON字段名和C#里的一致(都是PascalCase),可以在项目的配置里修改序列化规则:
如果你用的是ASP.NET Core + System.Text.Json
在Program.cs里添加如下配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 关闭自动大小写转换,保持原字段名的大小写 options.JsonSerializerOptions.PropertyNamingPolicy = null; });
如果你用的是Newtonsoft.Json(比如旧版ASP.NET或手动引入的)
在Program.cs(或Startup.cs)里配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 使用默认契约解析器,不转换字段名大小写 options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
方案3:单独指定ID字段的序列化名称
如果只需要让ID字段保持大写,其他字段保持默认的camelCase,可以给匿名类的ID字段加特性标记:
用System.Text.Json的情况
using System.Text.Json.Serialization; // ... var events = _context.Project.Select(s => new { [JsonPropertyName("ID")] // 指定序列化后的字段名为ID ID = s.ID, onSite = s.OnSite, onSiteTill = s.OnSiteTill, Number = s.Number, Type = s.Type, }).ToList();
用Newtonsoft.Json的情况
using Newtonsoft.Json; // ... var events = _context.Project.Select(s => new { [JsonProperty("ID")] // 指定序列化后的字段名为ID ID = s.ID, onSite = s.OnSite, onSiteTill = s.OnSiteTill, Number = s.Number, Type = s.Type, }).ToList();
额外提示
以后遇到这类字段不匹配的问题,第一步先看浏览器Network面板里的实际JSON响应内容,对比前端代码里的字段名,基本上就能快速定位问题啦。
内容的提问来源于stack exchange,提问作者Marek Špeta
相关产品推荐
相关产品推荐

