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); } } }
排查分析
- 防伪验证失败:ASP.NET Core默认强制启用防伪令牌验证,若表单未携带有效防伪令牌,服务器会直接返回400错误,不会进入
OnPost方法。 - 标签助手引用错误:原代码中
@addTagHelper *, MicroSoft.AspNetCore.Mvc.TagHelpers存在拼写错误(MicroSoft应为Microsoft),导致表单标签助手未生效,无法自动生成并注入防伪令牌。 - 路由匹配无问题: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
相关产品推荐
相关产品推荐

