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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:20:45