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

ASP.NET Core MVC登录遇HTTP ERROR 400:无法匹配[HttpPost]方法问题

ASP.NET Core MVC登录功能HTTP 400错误排查

问题现象

原本正常的ASP.NET Core MVC账户登录功能,在创建Identity自定义_PartialView后出现错误:

此页面无法正常工作
若问题持续,请联系网站管理员。
HTTP ERROR 400

浏览器地址为https://localhost:7185/Account/Login?returnurl=%2F,调试发现无法匹配控制器中的[HttpPost]方法,提示“未找到资源”。

相关代码

AccountController.cs

// Login
[HttpGet]
public IActionResult Login(string? returnUrl = null)
{
    LoginAccountViewModel loginViewModel = new LoginAccountViewModel();
    loginViewModel.ReturnUrl = returnUrl ?? Url.Content("~/"));
    return View(loginViewModel);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginAccountViewModel loginViewModel, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(loginViewModel.UserName, loginViewModel.Password, loginViewModel.RememberMe, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return View(loginViewModel);
        }
    }
    return View(loginViewModel);
}

Login.cshtml

<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@Model.ReturnUrl" method="post" role="form">
    <div class="p-4 p-md-5 border rounded-3 bg-body-tertiary">
        <!-- Right Side -->
        <div class="col-md-5 col-lg-4 order-md-last">
            <!-- OAuth -->
        </div>
        <!-- Left Side -->
        <div class="col-md-7 col-lg-8">
            <h4 class="mb-3">Account Login Details</h4>
            <form class="needs-validation" novalidate="">
                <div class="row g-3">
                    <!-- UserName -->
                    <div class="col-12">
                        <label asp-for="UserName" class="form-label">Username</label>
                        <div class="input-group has-validation">
                            <span class="input-group-text">@@</span>
                            <input asp-for="UserName" type="text" class="form-control" id="username" placeholder="Username" required>
                            <div class="invalid-feedback">
                                Your username is required.
                            </div>
                        </div>
                    </div>
                    <!-- Password -->
                    <div class="col-12">
                        <label asp-for="Password" class="form-label">Password</label>
                        <input asp-for="Password" type="password" class="form-control" id="password" placeholder="Password">
                        <div class="invalid-feedback">
                            Please enter atleast 6 characters.
                        </div>
                    </div>
                </div>
                <hr class="my-4">
                <!-- Remember Me -->
                <div class="form-check">
                    <label asp-for="RememberMe">
                        <input asp-for="RememberMe" />
                        @Html.DisplayNameFor(m => m.RememberMe)
                    </label>
                </div>
                <hr class="my-4">
                <!-- Login -->
                <div class="form-group mb-3">
                    <button class="w-100 btn btn-primary btn-lg" type="submit">Login</button>
                </div>
                <hr class="my-4">
                <!-- Register -->
                <p>
                    <a class="mb-5" asp-action="Register">Havent Registered yet?</a>
                </p>
            </form>
        </div>
    </div>
</form>

问题原因及解决办法

1. 嵌套表单导致提交目标异常

Login.cshtml中存在嵌套

标签:外层已经定义了包含正确路由和提交方法的form,内层又嵌套了另一个form。浏览器默认只会提交最内层表单,而内层表单未指定控制器、动作及防伪造令牌配置,导致无法匹配到HttpPost方法,同时缺少防伪造验证触发400错误。

解决:删除内层<form class="needs-validation" novalidate="">及其闭合标签,将验证属性移至外层form:

<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@Model.ReturnUrl" method="post" role="form" class="needs-validation" novalidate>
    <!-- 保留原有内容,移除内层form标签 -->
</form>

2. HttpGet方法语法错误

AccountController的HttpGet Login方法中,loginViewModel.ReturnUrl = returnUrl ?? Url.Content("~/"));多了一个闭合括号,会引发编译或运行时异常,影响页面参数传递和渲染。

解决:修正语法错误:

loginViewModel.ReturnUrl = returnUrl ?? Url.Content("~/");

3. ReturnUrl参数绑定优化

HttpPost方法中的string returnUrl未设置为可空类型,当returnUrl为空时可能导致参数绑定失败。

解决:将参数改为可空:

public async Task<IActionResult> Login(LoginAccountViewModel loginViewModel, string? returnUrl = null)

4. 防伪造令牌确认(可选)

虽然标签助手通常会自动生成防伪造令牌,但可手动确认页面是否包含__RequestVerificationToken隐藏字段。若缺失,可手动添加:

@Html.AntiForgeryToken()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:08:23