.NET 4.8升级到Core 7后XMLHttpRequest传值为null的问题
.NET 4.8升级到.NET Core 7后XMLHttpRequest传值返回null的问题分析与解决
核心原因:模型绑定规则的差异
.NET Framework的ASP.NET MVC模型绑定器兼容性较强,会自动尝试从JSON请求体、表单、查询字符串等多个位置匹配简单类型参数;而.NET Core的模型绑定规则更严格,默认情况下不会自动从JSON请求体绑定简单类型参数,必须显式指定绑定源,同时前端构造的JSON格式错误也会加剧这个问题。
前端代码的问题点
你在构造请求参数时,给JSON.stringify(dataPacket)额外套了一层单引号:
var params = '{"SentData": \'' + JSON.stringify(dataPacket) + '\'}';
这会导致最终发送的JSON中,SentData的值是带单引号的嵌套字符串(比如{"SentData": "'{\"key\":\"value\"}'"}),不符合标准JSON格式,.NET Core的JSON解析器无法正确解析,直接导致参数为null。
解决方案
方案1:给后端参数添加[FromBody]特性并修正前端JSON格式
后端修改代码,显式指定参数从请求体绑定:
public ActionResult ExportToExcel([FromBody] string SentData) { // 业务逻辑处理 }
前端修正参数构造方式,用JSON.stringify正确序列化整个对象,去掉多余的单引号:
// 传递dataPacket的JSON字符串形式 var params = JSON.stringify({ SentData: JSON.stringify(dataPacket) }); // 若dataPacket本身是字符串,直接传递即可 // var params = JSON.stringify({ SentData: dataPacket }); req.send(params);
方案2:使用复杂DTO类型接收(推荐)
定义一个与请求结构匹配的DTO类:
public class ExportExcelRequest { public string SentData { get; set; } }
后端方法改为接收该DTO,并添加[FromBody]特性:
public ActionResult ExportToExcel([FromBody] ExportExcelRequest request) { string sentData = request.SentData; // 业务逻辑处理 }
前端参数构造方式和方案1一致,用JSON.stringify正确序列化对象。
关键差异点总结
- .NET Framework MVC:模型绑定器自动兼容多种参数来源,对非标准JSON格式的容忍度较高。
- .NET Core:默认仅从路由、查询字符串绑定简单类型,必须用
[FromBody]指定从JSON请求体读取;同时JSON解析器严格遵循标准格式,错误格式的内容会直接导致绑定失败。
内容的提问来源于stack exchange,提问作者Beengie
相关产品推荐
相关产品推荐

