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

.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对象传参

新增一个简单的传输对象类接收参数,后续需要新增传参时直接加属性即可,不需要调整绑定逻辑:

  1. 新增DTO类
public class AddLikeRequest
{
    public int Postid { get; set; }
}
  1. 修改控制器方法的参数类型
[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";
    }
}
  1. 调整前端传参,用JSON.stringify格式化避免手动拼接字符串出错
data: JSON.stringify({postid: postid}), // 自动处理类型格式,不需要手动加引号

同步修改success回调里的计数逻辑即可。

其他注意事项

确保你的API控制器类上加了[ApiController]属性,.NET Core的API控制器需要这个属性才能正常启用JSON参数绑定、模型校验等内置特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:39:03