[.NET FW] FromBody参数始终为null问题求助
解决思路:FromBody参数始终为null的问题
问题核心分析
你的代码存在几个关键问题导致[FromBody]参数无法正确绑定:
- contentType设置错误:仅指定
charset=utf-8而非完整的application/json; charset=utf-8,Web API无法识别请求体的JSON格式。 - 参数类型不匹配:你发送的是序列化后的JSON对象(如
{"noteId": 1, ...}),但后台用string类型接收[FromBody],Web API默认仅能绑定原始JSON字符串(而非对象结构)。 - 路由参数命名不一致:URL中的
noteId与后台方法的id参数名不统一,虽然[FromUri]能正常工作,但建议保持命名一致避免潜在问题。
解决方案1:使用强类型模型接收(推荐)
这是Web API接收JSON对象的标准方式,兼容性和可读性最好:
- 创建对应的数据模型:
public class SessionNoteModel { public int NoteId { get; set; } // 添加noteData中的其他属性,比如Content、CreateTime等 }
- 修改后台API方法:
[System.Web.Http.HttpPost] public JsonResult UpdateSessionNoteBase([FromUri]int noteId, [FromBody]SessionNoteModel data) { // 处理逻辑 }
- 修正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字符串),但这种方式不推荐处理复杂对象:
- 修改Ajax请求的data部分:
data: JSON.stringify(JSON.stringify(noteData)), // 双重序列化,将对象转为JSON字符串的文本形式
- 后台方法保持不变:
[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
相关产品推荐
相关产品推荐

