如何从 jTable 复选框批量获取数据并安全传递至 SQL 存储过程

梦伟酱_1517

梦伟酱_1517

2026-04-25

148人浏览

原创

如何从 jTable 复选框批量获取数据并安全传递至 SQL 存储过程

本文详解如何在使用 jTable 的 ASP.NET WebForms 项目中,通过前端复选框(checkbox)精准提取指定列(如 ref_no)的字符串值,封装为数组,并通过 AJAX 安全调用 WebMethod,最终作为参数传入 SQL Server 存储过程完成批量操作。

本文详解如何在使用 jtable 的 asp.net webforms 项目中,通过前端复选框(checkbox)精准提取指定列(如 `ref_no`)的字符串值,封装为数组,并通过 ajax 安全调用 webmethod,最终作为参数传入 sql server 存储过程完成批量操作。

在基于 jTable 的账户管理模块中,常需支持“勾选多行 → 点击【Reassign】→ 批量更新某字段”的交互流程。关键挑战在于:如何从动态渲染的 jTable 行中,准确、可靠地提取被勾选行的目标字段(如 ref_no)字符串值,并以结构化方式传递给后端存储过程? 下面提供一套完整、可落地的解决方案。

✅ 正确提取复选框关联的 ref_no 字符串值

jTable 渲染后,每行

包含多个 ,其中 ref_no 对应第二列(索引为 1,因 Tag 列是首列)。需避免使用模糊的 nth-child(2)(易受隐藏列或结构变动影响),而应结合 jTable 字段定义精准定位:
$("#btnReassign").on("click", function () {
    const checkedBoxes = $('input.chk:checked'); // 使用类选择器更健壮
    const refNos = [];

    checkedBoxes.each(function () {
        const $row = $(this).closest('tr');
        // jTable 默认按 fields 顺序渲染,ref_no 是第二个字段(索引1)
        const $refNoCell = $row.find('td').eq(1); 
        const refNoText = $.trim($refNoCell.text()); // 去除空格,获取纯文本值
        if (refNoText) {
            refNos.push(refNoText);
        }
    });

    if (refNos.length === 0) {
        alert("请至少选择一个账户!");
        return;
    }

    console.log("选中的 ref_no:", refNos); // 示例输出: ["REF-001", "REF-005"]

    // 调用 WebMethod 执行批量操作
    reassignAccounts(refNos);
});

? 为什么不用 querySelectorAll('td:nth-child(2)')?
jTable 可能因排序、隐藏列或自定义 display 函数导致 DOM 结构与视觉列序不一致。eq(1) 配合 text() 是最稳定的方式——它直接读取用户可见的 ref_no 单元格内容。

✅ 安全调用 WebMethod 并传递字符串数组

WebMethod 需接收字符串数组,并将其转换为 SQL Server 支持的格式(如逗号分隔字符串或表值参数)。此处推荐逗号分隔字符串 + 后端 STRING_SPLIT(SQL Server 2016+),简洁且无需额外类型定义:

[WebMethod(EnableSession = true)]
public static object ReassignAccounts(string[] refNos)
{
    try
    {
        if (refNos == null || refNos.Length == 0)
            return new { Result = "ERROR", Message = "未提供有效 ref_no" };

        // 拼接为安全的逗号分隔字符串(已做基础校验)
        var safeRefNos = refNos
            .Where(s => !string.IsNullOrWhiteSpace(s))
            .Select(s => "'" + s.Replace("'", "''") + "'") // 防 SQL 注入:转义单引号
            .ToArray();

        if (safeRefNos.Length == 0)
            return new { Result = "ERROR", Message = "ref_no 格式无效" };

        string csvRefNos = string.Join(",", safeRefNos);

        // 调用存储过程,传入 CSV 字符串
        var result = _repository.NewAccount.ReassignByRefNos(csvRefNos);
        return new { Result = "OK", Message = $"成功重新分配 {result} 个账户" };
    }
    catch (Exception ex)
    {
        return new { Result = "ERROR", Message = "服务器处理失败:" + ex.Message };
    }
}

对应的 JavaScript 调用:

function reassignAccounts(refNos) {
    $.ajax({
        type: "POST",
        url: "List.aspx/ReassignAccounts",
        data: JSON.stringify({ refNos: refNos }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            const data = response.d;
            if (data.Result === "OK") {
                alert(data.Message);
                $('#TableContainer').jtable('reload'); // 刷新表格
            } else {
                alert("错误:" + data.Message);
            }
        },
        error: function (xhr, status, error) {
            alert("请求失败:" + error);
        }
    });
}

✅ 存储过程中安全处理字符串参数(SQL Server)

在存储过程中,使用 STRING_SPLIT 将 CSV 解析为表,再执行批量 UPDATE:

CREATE PROCEDURE [dbo].[sp_ReassignAccounts]
    @RefNosCSV NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    -- 使用 STRING_SPLIT 解析,并 JOIN 防止注入(因输入已预处理)
    UPDATE a 
    SET RMID = @NewRMID -- 假设需更新的字段
    FROM Accounts a
    INNER JOIN STRING_SPLIT(@RefNosCSV, ',') ss 
        ON a.ref_no = LTRIM(RTRIM(REPLACE(REPLACE(ss.value, '''', ''), ' ', '')));

    SELECT @@ROWCOUNT AS UpdatedCount;
END

⚠️ 重要注意事项

  • 永远不要拼接 SQL 字符串! 前端传入的 ref_no 已在 C# 层做 ' 转义,存储过程中仅作 REPLACE 清理,双重防护。
  • 若需更高安全性或兼容旧版 SQL Server,应改用表值参数(TVP),需额外定义 User-Defined Table Type。
  • jTable 的 chkAll 全选逻辑存在缺陷(会选中所有页面 checkbox,包括分页控件),建议优化为仅作用于当前页行:
    $(".chkAll").on("change", function() {
        const $pageRows = $('#TableContainer tbody tr'); // 仅当前页
        $pageRows.find('input.chk').prop('checked', this.checked);
    });

通过以上三步(精准提取 → 安全传输 → 可靠执行),即可实现从 jTable 复选框到 SQL 存储过程的端到端字符串数据流转,兼顾功能性、健壮性与安全性。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6495

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3632

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3310

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3319

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4999

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

3261

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

3069

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2688

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2788

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习