ASP.NET Core中如何将Fetch请求体绑定到控制器Action参数
问题解决:ASP.NET Core 6 MVC 请求体绑定失败
核心问题分析
你的代码里有两个关键问题导致模型绑定失败:
- 模型属性访问修饰符错误:
RequestSession的属性都是internal,ASP.NET Core模型绑定器默认只能访问public成员,无法读取/赋值internal属性。 - 序列化特性不匹配:ASP.NET Core 6默认使用
System.Text.Json处理JSON序列化,但你用的是Newtonsoft.Json的[JsonProperty]特性,该特性对System.Text.Json无效,导致字段映射失败。
修复方案
1. 修改RequestSession模型
替换访问修饰符并使用正确的序列化特性:
using System.Text.Json.Serialization; public record RequestSession { [JsonPropertyName("businessUnitName")] public string BusinessUnitName { get; set; } = string.Empty; [JsonPropertyName("caption")] public string Caption { get; set; } = string.Empty; [JsonPropertyName("contactData")] public ContactData[]? ContactData { get; set; } [JsonPropertyName("customerName")] public string CustomerName { get; set; } = string.Empty; [JsonPropertyName("destination")] public string Destination { get; set; } = string.Empty; [JsonPropertyName("language")] public string Language { get; set; } = string.Empty; [JsonPropertyName("priority")] public int Priority { get; set; } [JsonPropertyName("source")] public string Source { get; set; } = string.Empty; }
2. 额外检查点
- 确保前端
buildRequestSession()返回的对象字段名和模型[JsonPropertyName]指定的完全一致(System.Text.Json默认大小写敏感)。 - 若需调试请求体,可在控制器Action中添加代码查看原始请求内容:
using var reader = new StreamReader(Request.Body); var rawRequestBody = await reader.ReadToEndAsync(); // 输出rawRequestBody确认请求结构是否匹配
补充说明
如果你的项目确实需要使用Newtonsoft.Json而非System.Text.Json,需在Program.cs中配置替换默认序列化器:
builder.Services.AddControllersWithViews() .AddNewtonsoftJson(options => { // 可添加Newtonsoft.Json的配置项 });
这种情况下可以保留[JsonProperty]特性,但仍需将属性改为public。
内容的提问来源于stack exchange,提问作者SpookyBooky
相关产品推荐
相关产品推荐

