ASP.NET Core Web API表单提交HTTP 400错误排查求助
解决ASP.NET Core表单提交HTTP 400错误的方案
以下是针对你遇到问题的具体修复步骤:
1. 修正控制器实现
你的控制器继承了ControllerBase并使用[ApiController]特性,这是为API设计的,不适合处理表单提交后的页面跳转。同时API控制器默认不会自动绑定表单格式的简单参数,导致绑定失败触发400错误。修改控制器如下:
using Microsoft.AspNetCore.Mvc; namespace ASPLearner.Controllers { // 移除[ApiController]和API路由,改用普通MVC控制器 public class FormController : Controller { [HttpPost] // 显式标记从表单绑定参数(可选,继承Controller时可省略,但加上更明确) public IActionResult GetAction([FromForm] string name, [FromForm] string query) { // 这里可以添加你的业务逻辑,比如保存数据 return RedirectToAction("Success"); } // 新增Success动作,用于跳转后的页面 public IActionResult Success() { return View(); } } }
2. 修复表单HTML代码
原表单存在几个关键问题:onsubmit="return false;"阻止默认提交、asp-controller多写了Controller后缀、缺少防伪造令牌、无效的asp-for属性(无对应模型时会报错)。修改后的表单代码:
<form method="post" asp-controller="Form" asp-action="GetAction" id="form"> <!-- 添加ASP.NET Core必填的防伪造令牌,缺少会直接返回400 --> @Html.AntiForgeryToken() <div class="form-group"> <label for="name">Name</label> <input type="text" name="name" class="form-control" id="name" placeholder="Enter your name"> </div> <div class="form-group"> <label for="query">Query</label> <textarea class="form-control" name="query" id="query" style="margin-top:20px" rows="5" placeholder="Enter your query"></textarea> </div> <!-- 添加提交按钮,原代码缺少提交触发元素 --> <button type="submit" class="btn btn-primary mt-3">提交</button> </form>
3. 简化Program.cs配置
原配置中有冗余的services.AddMvc(),AddControllersWithViews()已经包含了MVC核心功能,同时调整路由注册顺序更规范:
using Microsoft.Extensions.DependencyInjection; var builder = WebApplication.CreateBuilder(args); // 添加控制器与视图支持 builder.Services.AddControllersWithViews(); // 添加Razor Pages支持 builder.Services.AddRazorPages(); var app = builder.Build(); app.UseStaticFiles(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); // 先注册控制器路由,再注册Razor Pages路由 app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.MapFallbackToPage("/Index"); app.Run();
4. 补充必要视图
在项目中创建Views/Form文件夹,添加Success.cshtml视图文件,用于跳转后的成功页面:
@{ ViewData["Title"] = "Success"; } <h1>提交成功!</h1> <p>你的信息已提交。</p>
关键错误原因说明
- API控制器特性冲突:
[ApiController]会强制启用模型验证和JSON绑定优先,表单的application/x-www-form-urlencoded格式无法自动绑定到简单参数,导致400。 - 防伪造令牌缺失:ASP.NET Core默认启用防伪造验证,表单未携带令牌会被直接拦截返回400。
- 表单提交阻止:
onsubmit="return false;"会阻止表单默认提交行为,若没有自定义JS处理,表单根本不会发送请求;若有JS则需手动携带防伪造令牌。 - 路由标签助手错误:
asp-controller="FormController"应为asp-controller="Form",控制器名称后缀Controller不需要在标签助手中指定。
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

