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

[.NET FW] FromBody参数始终为null问题求助

解决思路:FromBody参数始终为null的问题

问题核心分析

你的代码存在几个关键问题导致[FromBody]参数无法正确绑定:

  1. contentType设置错误:仅指定charset=utf-8而非完整的application/json; charset=utf-8,Web API无法识别请求体的JSON格式。
  2. 参数类型不匹配:你发送的是序列化后的JSON对象(如{"noteId": 1, ...}),但后台用string类型接收[FromBody],Web API默认仅能绑定原始JSON字符串(而非对象结构)。
  3. 路由参数命名不一致:URL中的noteId与后台方法的id参数名不统一,虽然[FromUri]能正常工作,但建议保持命名一致避免潜在问题。

解决方案1:使用强类型模型接收(推荐)

这是Web API接收JSON对象的标准方式,兼容性和可读性最好:

  1. 创建对应的数据模型:
public class SessionNoteModel
{
    public int NoteId { get; set; }
    // 添加noteData中的其他属性,比如Content、CreateTime等
}
  1. 修改后台API方法:
[System.Web.Http.HttpPost]
public JsonResult UpdateSessionNoteBase([FromUri]int noteId, [FromBody]SessionNoteModel data)
{
    // 处理逻辑
}
  1. 修正Ajax请求:
    确保contentType正确设置为JSON格式,同时保持data为序列化后的对象:
$.ajax({
    url: '/User/UpdateSessionNoteBase/' + noteData['noteId'],
    contentType: "application/json; charset=utf-8", // 关键修正
    type: 'POST',
    data: JSON.stringify(noteData),
    success: function(response) {
        // 处理回调
    }
});

解决方案2:若坚持用string接收FromBody参数

如果必须用string类型接收,需要将JSON对象包裹在引号中(发送原始JSON字符串),但这种方式不推荐处理复杂对象:

  1. 修改Ajax请求的data部分:
data: JSON.stringify(JSON.stringify(noteData)), // 双重序列化,将对象转为JSON字符串的文本形式
  1. 后台方法保持不变:
[System.Web.Http.HttpPost]
public JsonResult UpdateSessionNoteBase([FromUri]int id, [FromBody]string data)
{
    // 此时data会是noteData序列化后的JSON字符串,可手动反序列化为对象
    var noteModel = Newtonsoft.Json.JsonConvert.DeserializeObject<SessionNoteModel>(data);
}

额外检查项

  • 确认Web API配置中已启用JSON格式化:在WebApiConfig.cs中确保存在以下配置(通常默认已添加):
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  • 检查noteData是否为有效对象,避免序列化后为空字符串或无效JSON。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:46:09