ASP.NET MVC中按钮传递ID始终为1的问题求助
解决ASP.NET MVC动态按钮传递ID错误的问题
你遇到的核心问题主要集中在表单结构、循环逻辑和控制器硬编码这几个方面,下面一步步帮你梳理并解决:
问题根源分析
- 单表单多同名字段冲突:你整个页面只用了一个
Html.BeginForm,循环生成多个<input type="hidden" name="id" value="@item.id" />。浏览器提交表单时,同名字段只会传递最后一个(或第一个,取决于浏览器)的值,这就是你始终拿到id=1的原因。 - 循环逻辑冗余错误:外层
for循环加上内层foreach会重复渲染所有贴纸卡片,比如如果有3个贴纸,外层循环执行2次,每次都渲染3个,最终页面会出现6个重复卡片,完全不符合预期布局。 - 控制器硬编码ID:查看详情的分支里直接返回
Details(1),不管传递的ID是什么都跳转到ID=1的页面,这也会导致结果不符合预期。
解决方案:每个贴纸对应独立表单
我们给每个贴纸卡片单独创建一个表单,确保每个按钮提交时只会携带当前贴纸的ID,同时修正循环逻辑实现每行3个卡片的合理布局:
修改后的视图代码
@model IEnumerable<StickerOn.Models.Sticker> @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <div style="margin-left:50px"> <div class="body-content"> @{ // 先把Model转成List方便分组处理 var stickerList = Model.ToList(); // 每行显示3个,按步长3分组遍历 for (int i = 0; i < stickerList.Count; i += 3) { <div class="row"> @foreach (var item in stickerList.Skip(i).Take(3)) { <div class="col-md-4"> <div class="thumbnail"> <img src="@item.ImgToReprs" alt="贴纸图片" width="200" height="100"> <div class="caption"> <h3>@item.Name</h3> @Html.DisplayFor(m => item.id) <!-- 每个贴纸单独绑定一个表单 --> @using (Html.BeginForm("RedirectButton", "Sticker", FormMethod.Post)) { <input type="hidden" name="id" value="@item.id" /> <p> <!-- 购物车按钮:无文字,submitButton值为空 --> <button type="submit" name="submitButton" class="btn btn-success"> <i class="glyphicon glyphicon-shopping-cart"></i> </button> <!-- 查看详情按钮:设置明确value值,方便控制器判断操作类型 --> <button type="submit" name="submitButton" class="btn btn-default" value="ViewDetails">查看详情</button> </p> } </div> </div> </div> } </div> } } </div> </div>
修改后的控制器代码
[HttpPost] public ActionResult RedirectButton(int? id, string submitButton) { // 先校验ID有效性 if (!id.HasValue) { return RedirectToAction("Index"); } switch(submitButton) { case "ViewDetails": // 使用传递过来的真实ID跳转详情页,不再硬编码 return Details(id.Value); case "": // 这里添加你的购物车逻辑,比如调用AddToCart方法 // Example: AddToCart(id.Value); return RedirectToAction("Index"); // 可根据需求跳转到购物车页面或当前页 default: return RedirectToAction("Index"); } }
可选优化:用ActionLink简化详情跳转
如果查看详情只是展示数据,不需要POST请求,可以直接用Html.ActionLink替代表单按钮,这样更简洁:
把视图里的查看详情按钮替换为:
@Html.ActionLink("查看详情", "Details", "Sticker", new { id = item.id }, new { @class = "btn btn-default" })
这样就不需要把查看详情的逻辑放在RedirectButton方法里,直接由Details方法处理GET请求即可,购物车按钮仍保留独立表单提交POST请求。
内容的提问来源于stack exchange,提问作者Stanislav Balia
相关产品推荐
相关产品推荐

