Razor Pages表单提交Product Id传0 无法绑定到OnPost方法参数
问题描述
- 实现商品列表加入购物车功能时,点击Add To Cart按钮提交表单,后端未正确接收到Product Id,仅获取到long类型默认值0,无法匹配对应商品,导致加入购物车逻辑失效。
- 错误截图:

相关代码
前端商品列表视图代码
@model PagedList<Product> <div class="container-fluid"> @foreach (Product p in Model) { <div class="row"> <div class="col"> <div class="card m-1 p-1 bg-light"> <div class="bg-faded p-1"> <h4> @p.Name <span class="badge badge-pill badge-primary" style="float:right"> <small>$@p.RetailPrice</small> </span> </h4> </div> <form id="@p.Id" asp-page="/Cart" method="post"> <input type="hidden" name="Id" value="@p.Id" /> <input type="hidden" name="Name" value="@p.Name" /> <input type="hidden" name="RetailPrice" value="@p.RetailPrice" /> <input type="hidden" name="returnUrl" value="@ViewContext.HttpContext.Request.PathAndQuery()" /> <span class="card-text p-1"> @(p.Description ?? "(No Description Available") <button type="submit" class="btn btn-success btn-sm pull-right" style="float:right"> Add To Cart </button> </span> </form> </div> </div> </div> } </div>
后端Cart页模型代码
public class CartModel : PageModel { private IRepository repository; public Cart Cart { get; set; } public CartModel(IRepository repo, Cart cartService) { repository = repo; Cart = cartService; } public string ReturnUrl { get; set; } public void OnGet(string returnUrl) { ReturnUrl = returnUrl ?? "/store"; } public IActionResult OnPost(long productId, string returnUrl) { Product product = repository.Products.FirstOrDefault(p=>p.Id == productId); Cart.AddItem(product, 1); return RedirectToPage(new { returnUrl = returnUrl }); } public IActionResult OnPostRemove(long productId, string returnUrl) { Cart.RemoveLine(Cart.Lines.First(c=>c.Product.Id == productId).Product); return RedirectToPage(new {returnUrl = returnUrl}); } }
问题根因
ASP.NET Core Razor Pages 的模型绑定默认按名称精确匹配规则映射表单值与后端参数:
- 前端表单提交的商品ID字段
name属性值为Id - 后端
OnPost方法定义的商品ID入参名称为productId
二者名称不匹配,模型绑定器无法完成值映射,未被赋值的long类型参数会取默认值0,因此始终查询不到对应商品。
修复方案
两种方案选择其一即可:
- 修改前端隐藏域的name属性,与后端参数名保持一致:
<input type="hidden" name="productId" value="@p.Id" /> - 给后端参数添加
[FromForm]特性,显式指定绑定的表单字段名:public IActionResult OnPost([FromForm(Name = "Id")]long productId, string returnUrl)
优化建议:前端不需要额外提交Name、RetailPrice字段,后端通过productId从数据库查询商品完整信息即可,避免用户篡改表单字段传入非法价格、商品名。
内容的提问来源于stack exchange,提问作者PatBet
相关产品推荐
相关产品推荐

