.NET Core 7中Ajax提交三级嵌套节点时C#读取数据为Null
问题分析与解决方案
首先纠正一个细节:你应该使用[FromBody]特性而非[FormBody],这是.NET Core接收请求体数据的标准特性。
针对第三级Assets节点读取为Null的问题,以下是常见原因和解决方法:
1. 核对实体类层级结构定义
确保后端实体类和前端提交的JSON结构完全匹配,重点检查:
- 属性名称的大小写(比如前端是
assets,后端要对应Assets,或通过序列化配置统一规则) - 嵌套类的访问修饰符(必须是
public) - 每个类都有无参构造函数(反序列化需要)
示例正确的实体结构:
public class RootModel { public List<CampaignModel> Campaigns { get; set; } } public class CampaignModel { public string CampaignName { get; set; } public List<AssetModel> Assets { get; set; } // 第三级节点 } public class AssetModel { public string AssetId { get; set; } public string FileUrl { get; set; } }
2. 确保Ajax请求的格式正确
前端Ajax必须设置contentType: "application/json",并且将数据序列化为JSON字符串,不能直接传递JS对象:
const submitData = { Campaigns: [ { CampaignName: "夏季促销", Assets: [ { AssetId: "asset001", FileUrl: "/images/banner1.jpg" }, { AssetId: "asset002", FileUrl: "/images/poster1.jpg" } ] } ] }; $.ajax({ url: "/api/campaigns/submit", type: "POST", contentType: "application/json", data: JSON.stringify(submitData), // 必须序列化 success: function(res) { console.log(res); } });
3. 检查后端Action的参数绑定
确保Action方法的参数正确标记[FromBody],且参数类型为你定义的根实体类:
[HttpPost] public IActionResult SubmitCampaign([FromBody] RootModel requestModel) { // 此时可检查requestModel.Campaigns[0].Assets是否正常赋值 return Ok(); }
4. 排查JSON序列化配置
如果前端用驼峰式命名(如campaignName)、后端用帕斯卡式(CampaignName),需确保.NET Core的JSON序列化支持自动映射(默认已开启,也可显式配置):
在Program.cs中:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
另外,避免给实体类属性设置readonly或仅含getter,反序列化需要能写入属性值。
5. 调试请求内容
用浏览器开发者工具的Network标签,查看发送的JSON是否包含完整的Assets节点;也可在后端读取原始请求体,确认数据未在传输中丢失:
using var reader = new StreamReader(Request.Body); var rawJson = await reader.ReadToEndAsync(); // 输出rawJson查看实际接收的内容
内容的提问来源于stack exchange,提问作者Fahad Mahmood
相关产品推荐
相关产品推荐

