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

JQuery DataTable选择“全部”选项后无法降序排序问题求助

问题:DataTables选择“全部”选项后无法实现降序排列

我是JQuery新手,制作了一个包含选项的下拉选择框,其中“Todos(全部)”选项用于返回全部记录,代码如下:

<select id="sBusqueda" class="form-control fondo" name="sBusqueda" onchange="ModicaCampoTexto($(this));">
           <option value="all">Todos</option>
           <option value="nomProv">Nombre Proveedor</option>
           <option value="nSolicitud">Nº Solicitud</option>
</select>

当前所有功能正常,选择“Todos(全部)”选项时能正确重载记录,但数据是升序排列的,我需要它按从高到低降序排列。以下是我的DataTable初始化及事件处理代码:

$(document).ready(function () {
        var tablaSolicitud = $('#TablaSolicitudes').DataTable({
            "order": [[0, 'desc']],
            "processing": true, // for show progress bar
            "serverSide": true, // for process server side
            "searching": false,
            //"ordering": false,
            "language": {
                "url": "//cdn.datatables.net/plug-ins/1.10.16/i18n/Spanish.json"
            },
            "ajax": {
                "url": '@Url.Action("CargaSolicitudes", "DPSolicitudes")',
                "type": "POST",
                "datatype": "json"
            },
            "columnDefs": [{
                "targets": [0],
                "visible": false,
                "searchable": false
            }],
            "columns": [
                { "data": "DPSolicitudId", "name": "DPSolicitudId", "autoWidth": true },
                { "data": "NumeroSolicitud", "name": "NumeroSolicitud", "autoWidth": true },
                { "data": "CentroCosto", "name": "CentroCosto", "autoWidth": true },             
            ],
            "lengthMenu": [[5 ,10, 15, 20, 25, 50, 100, 99999], [5, 10, 15, 20, 25, 50, 100, 'TODOS']],
        });


$('#sBusqueda').change(function () {
            var opcionSeleccionada = $(this).val();

            // Verificar si la opción seleccionada es "Todos"
            if (opcionSeleccionada === 'all') {

                // Esto funciona 
                // Here I need your help
                var tablaReload = $('#TablaSolicitudes').DataTable();
                tablaReload.order([[0, 'desc']]).draw();
            }
        });

问题原因

因为你开启了serverSide: true,这意味着DataTables的所有排序、分页、过滤逻辑都由后端接口处理,前端的order().draw()只是传递排序参数给后端,而非直接在客户端排序数据。如果后端接口没有正确接收并应用这些排序参数,返回的数据自然还是升序的。另外,你在change事件中重新获取DataTable实例的方式虽不会报错,但复用初始化时的tablaSolicitud变量更规范。

解决方案

1. 修正前端重载逻辑,确保传递排序参数

直接使用初始化时保存的tablaSolicitud变量,设置排序后调用ajax.reload(),让DataTables带着正确的排序参数请求后端:

$('#sBusqueda').change(function () {
    var opcionSeleccionada = $(this).val();
    if (opcionSeleccionada === 'all') {
        // 设置排序规则后重载数据,确保后端收到排序参数
        tablaSolicitud.order([[0, 'desc']]).ajax.reload();
    }
});

2. 检查后端接口CargaSolicitudes的处理逻辑

后端需要接收DataTables自动传递的排序参数:

  • order[0][column]:排序的列索引(此处为0,对应DPSolicitudId)
  • order[0][dir]:排序方向(此处为desc)

在数据库查询时,需根据这些参数添加ORDER BY DPSolicitudId DESC的逻辑,确保返回的数据是降序排列的。

3. 额外提示

避免重复获取DataTable实例,初始化时保存的tablaSolicitud可直接复用,无需再通过$('#TablaSolicitudes').DataTable()重新获取,减少不必要的实例操作。

内容的提问来源于stack exchange,提问作者José Eduardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:38:09