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

ASP.NET Core表单提交失效求助:无法触发OnPost方法

ASP.NET Core Razor页面表单提交400错误,OnPost方法未触发问题排查

问题现象

在ASP.NET Core环境中,Razor页面的Get请求可正常执行并渲染视图,但表单提交时返回Bad Request (400),且完全无法触发后台代码中的OnPost方法。

前端Razor页面代码

@page
@using Northwind.EntityModels
@model Northwind.Web.Pages.SupplierModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Suppliers</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Company Name</th>
                <th>Country</th>
                <th>Phone</th>
            </tr>
        </thead>
        <tbody>
            @if (Model.Suppliers is not null)
            {
                @foreach(Supplier s in Model.Suppliers)
                {
                    <tr>
                        <td>@s.CompanyName</td>
                        <td>@s.Country</td>
                        <td>@s.Phone</td>
                    </tr>
                }
            }
        </tbody>
    </table>
</div>
<div class="row">
    <p>Enter details for a new Supplier.</p>
    <form method="post" asp-page="/Supplier" novalidate>
        <div>
            <input asp-for="Supplier.CompanyName" placeholder="company name"/>
        </div>
        <div>
            <input asp-for="Supplier.Country" placeholder="country name" />
        </div>
        <div>
            <input asp-for="Supplier.Phone" placeholder="Phone name" />
        </div>
        <input type="submit"/>
    </form>
</div>
@{}

后端PageModel代码

using Microsoft.AspNetCore.Mvc;// To use [BindProperty], IActionResult.
using Microsoft.AspNetCore.Mvc.RazorPages;
using Northwind.EntityModels;

namespace Northwind.Web.Pages
{
    public class SupplierModel : PageModel
    {
        private NorthwindContext _dbContext;
        public IEnumerable<Supplier>? Suppliers { get; set; }

        private readonly ILogger<SupplierModel> _logger;

        // add a property to store a single supplier
        [BindProperty]
        public Supplier? Supplier { get; set; }

        // OnPost that adds the supplier to the Suppliers table
        public IActionResult OnPost()
        {
            _logger.LogInformation("Onpost method excuted at {time}", DateTime.Now);

            // validation rule checking according to entity model 
            // like required, string length
            if (Supplier is not null && ModelState.IsValid)
            {
                // Log company name
                _logger.LogInformation("Valid Supplier data received: {companyName}", Supplier.CompanyName);
                WriteLine("is valid supplier");

                _dbContext.Suppliers.Add(Supplier);
                _dbContext.SaveChanges();

                return RedirectToPage("/Supplier");
            }
            else
            {
                // Log a warning 
                _logger.LogWarning("Invalid supplier data or ModelState is not valid"); 
                WriteLine("not valid supplier");

                // Return the original page
                return Page();
            }
        }

        public SupplierModel(NorthwindContext db, ILogger<SupplierModel> logger)
        {
            _dbContext = db;
            _logger = logger;
        }

        public void OnGet()
        {
            ViewData["Title"] = "Northwind B2B -Suppliers";
            Suppliers = _dbContext.Suppliers
                                  .OrderBy(c => c.Country)
                                  .ThenBy(c => c.CompanyName);
        }
    }
}

排查分析

  1. 防伪验证失败:ASP.NET Core默认强制启用防伪令牌验证,若表单未携带有效防伪令牌,服务器会直接返回400错误,不会进入OnPost方法。
  2. 标签助手引用错误:原代码中@addTagHelper *, MicroSoft.AspNetCore.Mvc.TagHelpers存在拼写错误(MicroSoft应为Microsoft),导致表单标签助手未生效,无法自动生成并注入防伪令牌。
  3. 路由匹配无问题:Get请求正常说明/Supplier路由对应Pages目录下的Supplier.cshtml路径正确,排除路由匹配问题;实体类验证规则只会在进入OnPost后导致ModelState无效,不会直接引发400错误。

解决方案

  • 修正标签助手拼写:将Razor页面中的@addTagHelper *, MicroSoft.AspNetCore.Mvc.TagHelpers修改为@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers,确保标签助手正常工作,表单会自动添加防伪令牌。
  • 手动添加防伪令牌:若标签助手仍未生效,可在表单内部手动添加@Html.AntiForgeryToken(),确保提交请求包含防伪验证信息。
  • 排查实体类验证:确认Supplier实体的必填字段(如CompanyName是否标记[Required]),前端输入空值会导致ModelState无效,可通过OnPost中的日志排查验证问题。

内容的提问来源于stack exchange,提问作者Muhammad Faizan Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:57:10