Asp.Net Core Razor Pages项目POST请求Code 400错误排查求助
问题分析与解决方案
核心原因:Razor Pages POST请求缺少防伪造令牌
Razor Pages默认强制开启请求伪造保护机制,所有POST请求必须携带防伪造令牌,否则服务器会直接返回400错误,且不会进入后端处理方法——这就是你设置的断点从未触发的根本原因。GET请求不受此限制,所以UserId接口能正常工作。
修复步骤
1. 前端请求添加防伪造令牌
首先从页面中获取自动生成的防伪造令牌,再将其加入POST请求的headers中:
// 获取页面中的防伪造令牌 const token = document.querySelector('input[name="__RequestVerificationToken"]').value; // 修改POST请求的headers配置 if (isInList) { response = await fetch('/Browse?handler=RemoveFromWatchlist', { method: 'POST', body: JSON.stringify({ userId, movieId }), headers: { 'Content-Type': 'application/json', 'RequestVerificationToken': token } }); } else { response = await fetch('/Browse?handler=AddToWatchlist', { method: 'POST', body: JSON.stringify({ userId, movieId }), headers: { 'Content-Type': 'application/json', 'RequestVerificationToken': token } }); }
2. 确保页面包含防伪造令牌
如果你的Browse.cshtml页面没有自动生成令牌,手动添加以下代码:
@Html.AntiForgeryToken()
3. 修正前端代码笔误
你在response.ok的处理块中错误使用了console.error,会导致成功操作时输出错误日志,改为console.log:
if (response.ok) { const iconElement = event.currentTarget.querySelector('i'); if (isInList) { iconElement.classList.remove('fa-solid', 'fa-check'); iconElement.classList.add('fas', 'fa-plus'); event.currentTarget.dataset.inList = "false"; } else { iconElement.classList.remove('fas', 'fa-plus'); iconElement.classList.add('fa-solid', 'fa-check'); event.currentTarget.dataset.inList = "true"; } console.log(`Successfully toggled movie with ID ${movieId} in list`); }
4. 可选:验证JSON字段匹配
ASP.NET Core默认支持JSON大小写不敏感匹配,但如果你的项目配置有特殊修改,可以在后端MovieData类上明确字段映射:
using System.Text.Json.Serialization; public class MovieData { [JsonPropertyName("userId")] public int UserId { get; set; } [JsonPropertyName("movieId")] public int MovieId { get; set; } }
额外排查建议
- 打开浏览器DevTools的Network面板,检查POST请求的Request Payload是否正确携带
userId和movieId - 查看Response返回的详细错误信息(你已通过
response.text()获取,重点关注是否有“防伪造令牌无效”相关提示) - 待请求能进入后端断点后,再验证数据库连接和SQL语句的正确性
内容的提问来源于stack exchange,提问作者QuestionablyUndefinedUser
相关产品推荐
相关产品推荐

