已设置[FromBody]和Content-Type,Controller Action仍无法接收Fetch API的JSON请求
问题原因及解决办法
你遇到的问题是请求体结构与控制器参数不匹配导致绑定失败:
- 前端发送的是包含
ProductPriceGroupID字段的JSON对象(如{"ProductPriceGroupID": 123}) - 但控制器参数是单个
int类型,ASP.NET Core的JSON序列化器无法将对象直接映射到基本类型参数,因此默认赋值为int的默认值0。
解决办法(二选一即可)
方法1:修改前端请求体,直接传递纯数值
将body: JSON.stringify(data)改为直接序列化数值本身:
async function GetEditModalHTML(productPriceGroupID) { const response = await fetch('/promotions/productprice/edit', { method: 'POST', headers: { 'Content-Type': 'application/json', RequestVerificationToken: $('input:hidden[name="__RequestVerificationToken"]').val() }, body: JSON.stringify(productPriceGroupID) // 直接传递数值,不再包裹对象 }); return await response.text(); }
方法2:创建DTO类匹配前端传入的对象结构
在后端定义一个数据传输对象(DTO),用来接收前端的JSON对象:
public class ProductPriceGroupRequest { public int ProductPriceGroupID { get; set; } }
然后修改控制器方法的参数:
[HttpPost] public async Task<IActionResult> Edit([FromBody] ProductPriceGroupRequest request) { int productPriceGroupID = request.ProductPriceGroupID; // 后续业务逻辑... }
两种方法均可解决绑定问题,推荐方法2,后续若需传递更多参数时扩展更方便。
内容的提问来源于stack exchange,提问作者AlwaysNeedingHelp
相关产品推荐
相关产品推荐

