ASP.NET Core 2.2提交竞价时拍卖ID始终传值为0的问题
你遇到的问题核心是:从Details页面跳转时通过路由传递的auctionItemId和auctionStartingBidAmount,在提交EnterBid表单时没有被携带到POST请求中。
当你点击Details页面的"Submit a Bid"链接时,这两个参数是通过GET请求的路由参数传递到EnterBid的GET页面,但默认情况下,这些路由参数不会自动包含在后续的POST表单提交里。所以当你点击Create按钮提交表单时,控制器的POST方法只能接收到表单里明确包含的字段值,而auctionItemId和auctionStartingBidAmount因为没有对应的表单字段,会被初始化为默认值0。
要解决这个问题,我们需要把这两个参数值存储在EnterBid表单的隐藏字段中,这样提交POST请求时就能把它们一起发送到控制器。具体步骤如下:
1. 添加EnterBid的GET控制器方法
首先你需要补充一个接收路由参数的GET版本的EnterBid方法,用来接收从Details页面传递过来的参数,并把它们传递给视图:
// GET: AuctionBids/EnterBid public IActionResult EnterBid(int auctionItemId, int auctionStartingBidAmount) { // 把参数存入ViewBag,或者直接绑定到模型(推荐后者) ViewBag.AuctionItemId = auctionItemId; ViewBag.AuctionStartingBidAmount = auctionStartingBidAmount; // 如果你允许修改AuctionBidModel,更推荐给模型添加对应属性并赋值 // var bidModel = new AuctionBidModel // { // AuctionItemId = auctionItemId, // AuctionStartingBidAmount = auctionStartingBidAmount // }; // return View(bidModel); return View(new AuctionBidModel()); }
2. 在EnterBid视图中添加隐藏字段
修改EnterBid的表单,添加两个隐藏字段,把从GET方法接收到的参数值存入其中:
<form asp-action="EnterBid"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <!-- 添加隐藏字段,传递auctionItemId和auctionStartingBidAmount --> <input type="hidden" name="auctionItemId" value="@ViewBag.AuctionItemId" /> <input type="hidden" name="auctionStartingBidAmount" value="@ViewBag.AuctionStartingBidAmount" /> <!-- 原有的表单字段 --> <div class="form-group"> <label asp-for="BidderName" class="control-label"></label> <input asp-for="BidderName" class="form-control" /> <span asp-validation-for="BidderName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="BidderPhone" class="control-label"></label> <input asp-for="BidderPhone" class="form-control" /> <span asp-validation-for="BidderPhone" class="text-danger"></span> </div> <!-- 其他字段保持不变 --> </form>
更规范的模型绑定方式(可选)
如果你可以修改AuctionBidModel类,建议给它添加对应的属性,这样更符合ASP.NET Core的模型绑定规范:
public class AuctionBidModel { // 原有属性... public int AuctionItemId { get; set; } public int AuctionStartingBidAmount { get; set; } }
然后修改GET方法:
public IActionResult EnterBid(int auctionItemId, int auctionStartingBidAmount) { var bidModel = new AuctionBidModel { AuctionItemId = auctionItemId, AuctionStartingBidAmount = auctionStartingBidAmount }; return View(bidModel); }
视图中的隐藏字段改为使用asp-for绑定:
<input type="hidden" asp-for="AuctionItemId" /> <input type="hidden" asp-for="AuctionStartingBidAmount" />
3. 验证效果
现在当你从Details页面点击"Submit a Bid"链接时,auctionItemId和auctionStartingBidAmount会被传递到EnterBid页面,并存入隐藏字段。提交表单时,这两个值会和其他表单数据一起发送到POST控制器,你就能获取到正确的数值,而不是默认的0了。
内容的提问来源于stack exchange,提问作者ChickenOverlord

