JQuery DataTables服务器端分页

时间:2012-07-19 09:43:19

标签: c# jquery asp.net pagination jquery-datatables

在我的网络应用程序中,我使用JQuery DataTables插件来显示从数据库中检索的数据。

我目前正在使用客户端分页,但我的表中的数据增长很多,而且在ASP.NET页面中加载现在变得有点慢。所以我打算切换到服务器端分页。

我知道DataTables插件支持它,但是我一直没有找到关于实现它的明确信息。

我的主要疑问是:如果我在服务器端实现分页,我还必须实现排序,或者我可以将它委托给客户端?

你有没有经历过这个?

注意我正在使用Linq to SQL连接到我的数据库

3 个答案:

答案 0 :(得分:8)

现有答案可能适用于旧版本的dataTable,但当前版本(我使用的是1.10+)会传递开始记录和长度,因此任何暗示pageNo * pageSize的内容都会给出结果不正确。

首先简单"手册"方法

接受的答案对于我想要的内容也非常复杂,经过一些调试后,我发现页面大小和开始记录只是作为名为Request的Http start值传递而且{ {1}}。文本搜索以length传递。排序顺序在名为search[value]的成员中传递,排序方向在order[0][column]等中传递。

我用来排序和过滤的基本代码如下所示:

从HTTP Request对象中获取分页,排序和过滤值:

order[0][dir]

首先应用(不区分大小写)搜索:

int startRec = 0;
int.TryParse(Request["start"], out startRec);
int pageSize = 10;
int.TryParse(Request["length"], out pageSize);
var search = Request["search[value]"];
var order = Request["order[0][column]"];
var direction = Request["order[0][dir]"];

var query = this._dataStore.Records.AsQueryable();

然后应用任何排序:

if (!string.IsNullOrWhiteSpace(search))
{
    query = query.Where(x => x.Label.ToLower().Contains(search.ToLower()));
}

最后应用分页:

switch (order)
{
    // My id column
    case "0":
        query = (direction == "desc") ? query.OrderByDescending(x => x.Id) : query.OrderBy(x => x.Id);
        break;
    // My label column
    case "1":
        query = (direction == "desc") ? query.OrderByDescending(x => x.Label) : query.OrderBy(x => x.Label);
        break;
}

现在可以返回正确的记录了。

更新(使用" Datatables.net for MVC5")

一旦我理解了服务器端dataTable的基础知识,就该开始寻找现有的插件/工具来简化这段代码了。到目前为止,对于MVC 5,我发现的最合适的是Datatables.net for MVC5 nuget包。

  1. 安装NuGet包

  2. 更改控制器操作以使用query = query.Skip(startRec).Take(pageSize); 提供IDataTablesRequest接口

  3. e.g。

    DataTablesBinder
    1. 首先应用任何搜索过滤器:
    2. e.g。

       public JsonResult Table([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestmodel)
      
      1. 应用任何排序:
      2. e.g。

        if (!string.IsNullOrEmpty(requestmodel.Search.Value))
        {
            query = query.Where(x => x.CompanyTypeName.Contains(requestmodel.Search.Value) || x.CompanyTypeDescription.Contains(requestmodel.Search.Value));
        }
        
        1. 然后像以前一样使用foreach (var sort in requestmodel.Columns.GetSortedColumns()) { switch (sort.Name) { case "CompanyTypeDescription": query = sort.SortDirection == Column.OrderDirection.Ascendant ? query.OrderBy(x => x.CompanyTypeDescription) : query.OrderByDescending(x => x.CompanyTypeDescription); break; case "CompanyTypeName": default: query = sort.SortDirection == Column.OrderDirection.Ascendant ? query.OrderBy(x => x.CompanyTypeName) : query.OrderByDescending(x => x.CompanyTypeName); break; } } Skip应用分页:
        2. e.g。

          Take
          1. 最后使用var result = query.Skip(requestmodel.Start).Take(requestmodel.Length).Select(x => new { x.CompanyTypeName, x.CompanyTypeDescription }); 对象返回JSON结果:
          2. e.g。

            DataTablesResponse

            这简化了所有的搜索,排序和安排。寻找一个很容易重复的模式。

            documentation for the addin is here

答案 1 :(得分:3)

由于您使用的是LINQ to SQL,因此paginate非常简单:

var c = new MyDataContext("your string");

c.Employees.Skip(pageIndex * pageSize).Take(pageSize);

此代码将在服务器上有效地分页

我没有使用 DataTables jQuery插件,但我假设您使用AJAX来获取数据(因为您没有使用MVC),所以只需将当前页面索引作为参数发送,以及每页的行数 - 页面大小,就是它

要满足要求,您还需要在服务器上订购查询,因此您需要将订单条件发送到服务器并应用订单。

要根据string在服务器上订购,请检查以下问题:

Dynamic LINQ OrderBy on IEnumerable<T>

答案 2 :(得分:0)

晚会很晚,但这值得分享:)

Employees
    .OrderBy(sortColumn + " " + sortOrder)
    .Skip(pageNo * pageSize)
    .Take(pageSize)
    .ToList();