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

ASP.NET MVC中按钮传递ID始终为1的问题求助

解决ASP.NET MVC动态按钮传递ID错误的问题

你遇到的核心问题主要集中在表单结构、循环逻辑和控制器硬编码这几个方面,下面一步步帮你梳理并解决:

问题根源分析

  1. 单表单多同名字段冲突:你整个页面只用了一个Html.BeginForm,循环生成多个<input type="hidden" name="id" value="@item.id" />。浏览器提交表单时,同名字段只会传递最后一个(或第一个,取决于浏览器)的值,这就是你始终拿到id=1的原因。
  2. 循环逻辑冗余错误:外层for循环加上内层foreach会重复渲染所有贴纸卡片,比如如果有3个贴纸,外层循环执行2次,每次都渲染3个,最终页面会出现6个重复卡片,完全不符合预期布局。
  3. 控制器硬编码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:13