ASP.NET POST API接收.NET MAUI JSON并转换为数据模型的问题
问题解决步骤
1. 修复ASP.NET API接收逻辑
你的API当前直接把单个参数暴露在Post方法签名里,但ASP.NET无法自动从JSON请求体中解析分散的参数,需要用模型类统一接收,同时用[FromBody]标记告诉框架从请求体读取数据。另外,async void会导致异步操作无法正确追踪,要改成async Task。
修改后的API代码:
[Route("api/[controller]")] [ApiController] public class ViewController : ControllerBase { // 定义接收请求的DTO类(可与View实体类一致,也可单独定义) public class ViewRequest { public DateOnly Date { get; set; } public TimeOnly Time { get; set; } public int ProductId { get; set; } } // POST api/<ViewController> [HttpPost] public async Task<IActionResult> Post([FromBody] ViewRequest request) { if (!ModelState.IsValid) { return BadRequest(ModelState); } using (VapeshopContext db = new VapeshopContext()) { View view = new View { Date = request.Date, Time = request.Time, ProductId = request.ProductId }; db.Views.Add(view); await db.SaveChangesAsync(); } return Ok(); } }
2. 修复.NET MAUI请求代码
你当前错误地同时使用了PostAsJsonAsync和StringContent——PostAsJsonAsync会自动把对象序列化为JSON并设置正确的Content-Type,不需要手动创建StringContent,这会导致请求格式错误,服务器无法解析。
修改后的请求代码:
private async void toInfoPage(object obj) { if (obj != null) { var p = obj as Product; // 直接传递匿名对象给PostAsJsonAsync,框架会自动处理序列化 var requestData = new { Date = DateOnly.FromDateTime(DateTime.Now), Time = TimeOnly.FromDateTime(DateTime.Now), ProductId = p.Id }; await httpClient.PostAsJsonAsync("http://10.0.2.2:5125/api/View", requestData); var newPage = new ProductInfo(obj as Product); await Navigation.PushAsync(newPage); } }
核心问题说明
- 服务器端必须通过**模型类+[FromBody]**接收JSON请求体,不能直接在方法签名里写分散参数,除非参数是URL查询字符串或路由参数。
PostAsJsonAsync和StringContent不要混用,前者已经封装了序列化和请求头设置,手动传StringContent会导致双重序列化,服务器无法解析正确数据,这就是你参数全为零值的直接原因。
内容的提问来源于stack exchange,提问作者vhhs
相关产品推荐
相关产品推荐

