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

如何通过jQuery和Ajax向ASP.NET MVC控制器传递ID?问题求助

问题分析与解决思路

首先一眼就揪出了核心问题:你在foreach循环里给每个<div>和<p>都用了相同的id(pan和TestsId),但HTML里的id属性要求是全局唯一的!当你用JS去获取这些元素时,只会拿到页面中第一个匹配该id的元素,自然就拿不到对应项的正确Id了——这就是你操作出错的关键原因。

另外,用隐藏的<p>标签存业务数据也不是最优写法,更推荐用HTML5的data-*自定义属性来存储这类数据,既简洁又符合规范。

修正后的代码示例

把重复的id换成class,同时用data-id来存储item的Id:

@foreach (var item in listTest) {
    <div class="form-group panel panel-default pan-item">
        <!-- 用data属性存Id,替代隐藏的p标签 -->
        <div class="test-item" data-id="@item.Id">
            <text>@item.Name</text>
            <text>@item.testTypeCategory.Category</text>
            <text>@item.testTypeName.Name</text>
            <text>@item.Price</text>
            <button class="btn btn-danger btn-cart">加入购物车</button>
        </div>
    </div>
}

若需用JS获取对应Id(以点击按钮为例)

假设你是点击按钮时要获取当前项的Id,JS可以这么写:

// 给所有按钮绑定点击事件
document.querySelectorAll('.btn-cart').forEach(btn => {
    btn.addEventListener('click', function() {
        // 向上找到包含data-id的父元素
        const testItem = this.closest('.test-item');
        const testId = testItem.dataset.id;
        console.log('当前选中的测试项Id:', testId);
        // 这里就可以用testId做后续操作了
    });
});

补充:如果坚持保留隐藏标签写法

至少要把id="TestsId"改成class="TestsId",然后通过按钮的上下文(父元素)去定位对应元素:

btn.addEventListener('click', function() {
    const testId = this.closest('.pan-item').querySelector('.TestsId').textContent;
});

但还是更推荐data-*属性的写法,代码更简洁,也更贴合HTML的设计初衷。

内容的提问来源于stack exchange,提问作者Nove124

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:28:44