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

动态添加多行TextBox后,Ajax与对应组件绑定问题求解

解决动态表格中Ajax按钮对应单行TextBox的问题

你的问题核心是HTML元素ID重复,以及Ajax中固定使用ID选择器导致始终获取第一个TextBox的值。HTML规范要求ID必须唯一,当存在多个相同ID的元素时,jQuery的ID选择器只会返回第一个匹配的元素,所以多行会失效。

1. 修正表格代码:移除重复ID,改用类标识元素

将重复的id属性替换为class,确保每个元素的标识唯一且可批量定位:

<a href="#" id="addNew" style="text-align:right;float:right"><input type="button" value="Add record" style="height: 30px;width: 110px;font-size: 0.75em" /></a>
<table id="dataTable">
    <thead>
        <tr>
            <th>Name</th>
        </tr>
    </thead>
    <tbody>
            int i = 0;
            //foreach (var p in Model.TBHDR)
            for (i = 0; i < Model.TBHDR.Count && i < Model.TBDTL.Count; i++)
            {
        <tr>
            <td>@Html.TextBoxFor(mod => mod.TBHDR[i].PR_REQ_OWNER, new { @class = "hdr_req_owner own" })<input type="button" value="Search" class="btnSearch" /></td>
            <td><a href="#" class="remove" name="pr_remove">Remove</a></td>
        </tr>
            }
    </tbody>
</table>    

注意:动态添加新行时,新行的TextBox和按钮必须遵循同样规则,只能用类标识,不能重复使用ID

2. 修改Ajax函数:通过DOM关联获取对应TextBox

利用DOM层级关系,定位当前点击按钮所在行的TextBox,确保请求和更新的都是当前行的输入值:

$('#dataTable').on('click', '.btnSearch', function (e) {
    // 定位当前按钮所在行的目标TextBox
    var $targetInput = $(this).closest('tr').find('.hdr_req_owner');
    
    $.ajax({
        url: "@Url.Action("GetOwner", "PR_Creation")",
        data: { ownerName: $targetInput.val() },
        type: "GET",
        dataType: "json",
        success: function (data) {
            // 更新当前行的TextBox值
            $targetInput.val(data);
        },
        error: function () {
            alert("Failed! Please try again.");
        }
    });
});

核心逻辑说明

  • $(this):指代当前被点击的搜索按钮
  • .closest('tr'):向上查找最近的行元素,锁定按钮所在的行
  • .find('.hdr_req_owner'):在该行内精准定位对应的TextBox,避免跨行匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:00:09