.Net Core 5.0 Razor Page调用Web API POST接口始终返回400错误
问题原因
你遇到的400类型转换错误是.NET Core中[FromBody]绑定单个简单类型参数的特性导致的:
当你用[FromBody]修饰int、string这类简单类型参数时,ASP.NET Core会直接读取整个请求Body的原始值做转换,而不会从JSON对象中提取对应属性的值。你当前前端传的是{"postid":"123"}这种带属性的JSON对象,框架尝试把整个JSON对象转成int自然会失败,而且你给postid的值加了双引号,相当于传的是字符串类型,进一步加剧了类型不匹配问题。
另外你现有代码的点赞计数逻辑也有问题,likecount + 1;没有做赋值操作,就算请求成功页面计数也不会更新。
可行解决方案
你可以二选一修改,更推荐第二种方案,扩展性更好:
方案1:调整前端传参格式,适配后端单个参数绑定
直接传postid的原始数值,不要包裹成JSON对象,代码修改如下:
$(document).ready(function () { $('#like-post').on('click', function () { var postid = parseInt($('#idlabel').text()); $.ajax({ url: '/api/Likes/AddPostLike/', type: 'POST', dataType: 'text', data: postid, // 直接传数值,不需要加引号和JSON对象包裹 contentType: 'application/json', success: function () { var likecount = parseInt($('#like-post-count').text()); likecount += 1; // 补充赋值操作,计数才会生效 $('#like-post-count').text(likecount); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("responseText=" + XMLHttpRequest.responseText + "\n textStatus=" + textStatus + "\n errorThrown=" + errorThrown); } }); }); });
后端代码不需要修改即可正常运行。
方案2(推荐):后端新增DTO接收参数,适配JSON对象传参
新增一个简单的传输对象类接收参数,后续需要新增传参时直接加属性即可,不需要调整绑定逻辑:
- 新增DTO类
public class AddLikeRequest { public int Postid { get; set; } }
- 修改控制器方法的参数类型
[HttpPost] [Route("AddPostLike")] public async Task<string> AddPostLike([FromBody] AddLikeRequest request) { int postid = request.Postid; if(_signInManager.IsSignedIn(User)) { ApplicationUser user = await _userManager.GetUserAsync(User); Likes newLike = new Likes(); newLike.Post = postid; // 已经是int类型,不需要额外做Convert转换 newLike.Commentid = null; newLike.Userid = user.Id; await _likeService.LikeAsync(newLike); return $"liked"; } else { return $"User Must Be Logged in to Like"; } }
- 调整前端传参,用
JSON.stringify格式化避免手动拼接字符串出错
data: JSON.stringify({postid: postid}), // 自动处理类型格式,不需要手动加引号
同步修改success回调里的计数逻辑即可。
其他注意事项
确保你的API控制器类上加了[ApiController]属性,.NET Core的API控制器需要这个属性才能正常启用JSON参数绑定、模型校验等内置特性。
内容的提问来源于stack exchange,提问作者WannabePuppetMaster
相关产品推荐
相关产品推荐

