VS 2022中ASP.NET Core Razor页面OnPostAsync方法返回HTTP 400错误
兄弟,遇到Razor页面OnPostAsync返回400错误,我之前也踩过好几个坑,最常见的原因就是CSRF(跨站请求伪造)验证失败——毕竟ASP.NET Core Razor页面默认就开启了这个保护机制,咱们一步步来排查:
先检查表单的防伪令牌:
如果你用的是普通HTML表单,一定要在表单内部加上@Html.AntiForgeryToken();要是用Razor的表单标签助手<form method="post">,它会自动帮你插入隐藏的防伪令牌(你可以查看页面渲染后的HTML,找name为__RequestVerificationToken的input标签)。要是表单里没这个令牌,服务器直接就会返回400拒绝请求。排查模型绑定与验证问题:
400错误也可能是表单提交的数据和你的LoginModel属性不匹配,或者模型里带[Required]这类验证特性的字段没传值,导致模型验证失败。你可以在OnPostAsync方法的开头加一段代码,先检查模型状态:if (!ModelState.IsValid) { // 这里可以打印ModelState的错误信息,或者直接返回页面看验证提示 return Page(); }调试的时候看看
ModelState.Errors里的具体内容,就能快速定位到哪项数据出了问题。如果你用AJAX提交请求:
要是通过JS发送POST请求,得手动在请求头里带上防伪令牌。首先从浏览器的Cookie中取出XSRF-TOKEN的值,然后在AJAX请求的headers里添加X-XSRF-TOKEN: 你取出的令牌值,这样服务器才能通过验证。检查OnPostAsync方法的签名:
确保方法的定义是正确的,比如:public async Task<IActionResult> OnPostAsync() { // 你的业务逻辑 }要是需要接收表单数据,参数要和表单字段对应,比如
public async Task<IActionResult> OnPostAsync(LoginInputModel input),保证输入模型的属性名和表单的name属性一致(默认不区分大小写,但尽量保持一致避免踩坑)。
备注:内容来源于stack exchange,提问作者Iyad ADJEROUD

