【问题标题】:Why pagination doesn't work on serverside proccessing of jquery datatables even though "recordsTotal" and "recordsFiltered" are equal为什么即使“recordsTotal”和“recordsFiltered”相等,分页也不适用于jquery数据表的服务器端处理
【发布时间】:2015-03-17 14:14:58
【问题描述】:

我的数据表(jquery 数据表 1.10.5)具有服务器端处理功能。除了分页之外,一切都在这里工作。这是 jsfiddle http://jsfiddle.net/e9btzpox/5/ .我搜索了很多帖子,到处都说“recordsTotal”和“recordsFiltered”应该相等,但这也不起作用。

这是我的代码示例:

$table.dataTable({
    "serverSide": true,
        "processing": true,
        "processing": true,
        "columns": [
        ["data", 1],
        ["data", 2]
    ],
        "ajax": {
        "url": "/test/0",
            "dataSrc": function (json) {
            var data = json.aaData;
            return data;
        }
    },
        "createdRow": function (row, data, index) {
        var chk_name = 'chk_' + data[0].id;
        $('td:eq(0)', row)
            .html('<input name="' + chk_name + '" type="checkbox" value="1">');

        var select_name = 'select_' + data[0].id;
        html =
            '<select name="' + select_name + '">' + '<option value="">Select one</option>' + '<option>' + data[2].operation[0] + '</option>' + '<option>' + data[2].operation[1] + '</option>'; + '</select>';

        $('td:eq(1)', row).html(html);
    },
});

这是 json 响应的示例:-

{"draw": 1,
    "recordsTotal": "11",
    "recordsFiltered": "11",

    "aaData": [
    [{
        "id": 1
    }, {
        "chk": "on"
    }, {
        "operation": ["Modify", "Delete"]
    }] 
  }

使用服务器端代码更新:-

public class DataTableObject {
    int     draw;
    String  recordsTotal;
    String  recordsFiltered;
    List<Student> data;

    public int getDraw() {
        return draw;
    }
    public void setDraw(int draw) {
        this.draw = draw;
    }
    public String getRecordsTotal() {
        return recordsTotal;
    }
    public void setRecordsTotal(String recordsTotal) {
        this.recordsTotal = recordsTotal;
    }
    public String getRecordsFiltered() {
        return recordsFiltered;
    }
    public void setRecordsFiltered(String recordsFiltered) {
        this.recordsFiltered = recordsFiltered;
    }
    public List<Student> getData() {
        return data;
    }
    public void setData(List<Student> data) {
        this.data = data;
    }
    public List<Student> getAaData() {
        return data;
    }

    public void setAaData(List<Student> aaData) {
        this.data = aaData;
    }
}

json 响应正在准备为:

protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("application/json");
           List<Students> listOfStudent=           getStudentList();
          DataTableObject dataTableObject = new DataTableObject();
 dataTableObject.setDraw((Integer.valueOf(request.getParameter("draw"))));
        dataTableObject.setRecordsTotal("2000");
        dataTableObject.setRecordsFiltered("2000");
        dataTableObject.setAaData(listOfStudent);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String json = gson.toJson(dataTableObject);
        out.print(json);
}

public List<Students> getListOfStudents(){
List<Students> listOfStudent = new ArrayList<Students>();
for (int i = 1; i <= 200; i++) {
            aStudent = new Student();
            String [] names= new String [3];
            names[0]  = "Sandeep"+i;
            names[1] = "Jaspal"+i;
            names[2] = "Harpal"+i;
            aStudent.setId(""+i);
            aStudent.setChk("off");
            aStudent.setOperation(new String[]{"modify","delete"});
            listOfStudent.add(aStudent);
}
return listOfStudents;      
}

【问题讨论】:

  • 分页不起作用,因为您需要在服务器端代码中对数据进行分页。参数iDisplayLengthiDisplayStart 传递给/test/0,您需要在查询中使用它们,否则将返回所有数据。您还没有添加任何服务器端代码,所以这只是一个猜测......
  • @markpsmith :感谢您在这里帮助我,我将使用服务器端代码更新帖子,请看一下。我有点卡在这里。
  • 您需要将分页参数合并到您的查询中,虽然看起来您实际上并没有使用数据库,但原理应该是相同的。在服务器端代码中设置断点并检查 Request["iDisplayLength"]Request["iDisplayStart"]
  • @markpsmith :我的请求中有这些参数:- "draw","start","length", search[value], search[regex], draw, columns[0][data ], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[ 1][数据],列[1][名称],列[1][可搜索],列[1][可排序],列[1][搜索][值],列[1][搜索] [regex], order[0][column],,order[0][dir],但问题是如何在服务器端使用这些参数进行分页工作??
  • 你需要的参数大概是startlength。我对 v1.10 不是很熟悉,所以您可能需要查看文档来确认。当您翻阅结果时,您能看到 start 的值发生变化吗?

标签: jquery pagination jquery-datatables


【解决方案1】:

在 1.10 中,服务器获取名为 startlength 的参数用于分页。您需要使用Skip()Take() 来分页您的学生列表。

例如

var start = Integer.valueOf(request.getParameter("start"));
var length = Integer.valueOf(request.getParameter("length"));
List<Students> listOfStudent = getStudentList();
List<Students> filteredList = listOfStudent.Skip(start).Take(length)
dataTableObject.setAaData(filteredList);

这也意味着您的记录数(全部和过滤)应该是这些列表中的项目数:

例如类似:

dataTableObject.setRecordsTotal(listOfStudent.Count());
dataTableObject.setRecordsFiltered(filteredList.Count());

注意:您没有显示任何对搜索和排序的支持,但它们需要在分页之前发生。

【讨论】:

    【解决方案2】:

    当我将 recordsTotal 和 recordsFilteres 值作为字符串而不是整数发送时,我在分页部分看到了一些问题。所以你的值应该如下所示,没有引号:

    "recordsTotal": 11,
    "recordsFiltered": 11,
    

    【讨论】:

      【解决方案3】:

      假设我们使用 jquery 数据表服务器端分页,开始 = 0,长度 = 25

      recordsFiltered:(这里年龄是过滤的动态参数)

      select * from students where IsDeleted = 0 AND age = 18 limit start, length
      

      也可以

      select * from students where IsDeleted = 0 limit start, length
      

      recordsTotal: (如果你使用这是错误的)

      select count(1) as Total from students where IsDeleted = 0 limit start, length
      

      recordsTotal:(这是正确的方法,完全使用与 recordsFiltered 相同的查询,但省略 limit 子句)

      select count(1) as Total from students where IsDeleted = 0 AND age = 18
      

      也可以

      select count(1) as Total from students where IsDeleted = 0 limit start, length
      

      【讨论】:

        猜你喜欢
        • 2015-03-31
        • 2017-08-26
        • 1970-01-01
        • 2012-02-16
        • 2015-06-12
        • 2012-03-25
        • 1970-01-01
        • 2015-12-22
        • 2016-08-15
        相关资源
        最近更新 更多