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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:48:17