[FromBody]接收Fetch传值始终为null,求排查解决方法
解决[FromBody]接收Fetch请求值为Null的问题
以下是针对该问题的排查步骤和解决方案:
1. 检查Sewa实体类定义
这是模型绑定失败最常见的原因:
- 确保实体类的属性名称与前端JSON键完全一致(你的序列化配置已开启
PropertyNameCaseInsensitive,大小写不影响,但名称必须完全匹配) - 实体类必须拥有公共无参构造函数
- 所有需要绑定的属性必须有公共setter
- 嵌套的
DetailSewa对应的类/集合也要满足以上要求,比如前端传数组时,实体类对应属性应为public List<DetailSewaItem> DetailSewa { get; set; }
2. 验证前端请求体的合法性
- 在
JSON.stringify(sewa)前添加console.log(sewa),检查barangSewa(即DetailSewa的值)是否为合法JSON结构,避免包含undefined、循环引用对象,这些会导致JSON.stringify生成无效数据 - 打开浏览器开发者工具的Network面板,查看请求的
Payload确认发送的JSON字符串完整且格式正确;同时检查Request Headers中的Content-Type是否确实为application/json;charset=utf-8
3. 排查模型绑定错误详情
修改Controller代码,添加模型状态验证以获取具体绑定错误:
[HttpPost] public IActionResult CreateSewaPeralatan([FromBody] Sewa model) { ResponseSewa<Sewa> gResponse = new ResponseSewa<Sewa>(); try { // 新增模型状态检查 if (!ModelState.IsValid) { var errorMessages = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage); gResponse.State = false; gResponse.Message = string.Join("; ", errorMessages); return StatusCode(StatusCodes.Status400BadRequest, gResponse); } _transaksiService.CreateSewa(model); gResponse.State = true; gResponse.Object = model; } catch (Exception ex) { gResponse.State = false; gResponse.Message = ex.Message; } return StatusCode(StatusCodes.Status200OK, gResponse); }
前端捕获错误后可查看具体绑定失败原因,比如属性类型不匹配。
4. 确认路由匹配正确性
检查TransaksiController类上的路由配置,确保/Transaksi/CreateSewaPeralatan能正确映射到目标Action。例如Controller类需标注:
[Route("[controller]")] public class TransaksiController : Controller { // ...你的Action代码 }
5. 类型匹配与序列化配置补充
- 如果
Sewa类包含枚举类型(如TipeDokumen),需在序列化配置中添加枚举转换器:
services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.PropertyNamingPolicy = null; // 添加枚举字符串转换器 options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); });
- 日期类型(如
TanggalAcara)需确保前端传递的格式能被后端解析,比如YYYY-MM-DD格式,或在实体类属性上标注自定义转换逻辑
内容的提问来源于stack exchange,提问作者Fajar Pratama
相关产品推荐
相关产品推荐

