You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API接收XHR POST封装对象为null问题排查

ASP.NET Web API接收Wrapper对象时属性为null的解决办法

嘿,我一眼就发现问题所在了——你在前端代码里犯了一个典型的重复JSON序列化错误,这直接导致后端的模型绑定失败,所以wrapper.house和wrapper.user都是null。

问题根源分析

看你的前端代码:

var house = JSON.stringify({address : address, zip : zip});
var user = JSON.stringify({Email: email, Password: "aaaAAA1!"});
var wrapper = JSON.stringify({house : house, user : user});

你先把house和user这两个普通对象单独序列化成了JSON字符串,然后又把这两个字符串作为值放到wrapper对象里,再做一次序列化。最终发送到后端的请求体是这样的结构:

{
  "house": "{\"address\":\"你的地址\",\"zip\":\"你的邮编\"}",
  "user": "{\"Email\":\"你的邮箱\",\"Password\":\"aaaAAA1!\"}"
}

而你的后端Wrapper类期望的是嵌套的House和User实体对象,不是字符串类型。Web API的模型绑定器没办法把这些字符串自动转换成对应的实体类,所以属性自然就都是null了。

解决办法:只做一次最外层序列化

你只需要保留最外层对象的一次JSON序列化,内层的house和user保持原始的JS对象状态就好。修改后的前端代码如下:

var xhr = new XMLHttpRequest(); 
var url = "api_call"; 
xhr.open('POST', url); 
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); 

// 直接创建原始JS对象,不要单独序列化
var house = {address : address, zip : zip}; 
var user = {Email: email, Password: "aaaAAA1!"}; 

// 只对最外层的wrapper对象做一次序列化
var wrapper = JSON.stringify({house : house, user : user}); 

xhr.send(wrapper);

额外的后端检查点

为了确保万无一失,你还可以确认这几点:

  • 确保House和User类的属性名称和前端JSON的键名一致(默认模型绑定大小写不敏感,但保持一致能避免不必要的问题)
  • 给你的API方法加上[HttpPost]特性,显式标记这是POST请求(虽然你用了POST方式,但显式标记更规范)

修改后的后端方法示例:

[HttpPost]
public async Task<HttpResponseMessage> ApiCall(Wrapper wrapper) 
{ 
    House house = wrapper.house; 
    User user= wrapper.user; 
    // 你的业务逻辑代码...
}

这样修改后,前端发送的就是标准的嵌套对象JSON,后端的模型绑定器就能正确解析并填充wrapper的属性了。

内容的提问来源于stack exchange,提问作者Mocha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:30:54