JQuery的数据表服务器端分页(JQuery DataTables server-side pag

2019-07-30 11:58发布

在我的web应用程序我使用jQuery 数据表插件,显示了从数据库检索数据。

我目前使用的客户端分页,但在我的表中的数据会成长很多,和装载在ASP.NET页面正在成为一个有点慢。 所以我打算切换到服务器端分页。

我知道,数据表插件支持它,但搜索周围我还没有找到明确无一不关于实现它。

我的主要疑问是:如果我实现服务器端分页我也必须执行顺序,或者我可以把它委托给客户端?

你有没有经历过这样的?

注:我使用的LINQ to SQL连接到我的数据库

Answer 1:

现有的答案可能适用于旧版本的DataTable的,但目前的版本(我使用1.10+)传递开始记录和长度,所以,只要提示pageNo * pageSize是要给不正确的结果。

首先简单的“手册”的方法

接受答案也是为了什么,我想这样做很复杂,一些调试后,我发现,页面大小,并开始记录只是作为传递的Http Request命名值startlength 。 文本搜索作为传递search[value]排序顺序是在一个构件传递命名order[0][column]和在排序方向order[0][dir]

我曾经进行排序和筛选的基本代码如下所示:

获取分页,排序,并从HTTP请求对象滤波值:

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;
}

最后套用分页:

query = query.Skip(startRec).Take(pageSize);

正确的记录,现在准备返回。

更新(使用“Datatables.net为MVC5”)

一旦我明白了服务器端的数据表的基础知识,现在是时候开始寻找现有的插件/ utils的简化了这个代码。 最合适的一个,我发现到目前为止,对于MVC 5,是Datatables.net为MVC5 NuGet包。

  1. 安装NuGet包

  2. 改变控制器操作使用DataTablesBinder提供IDataTablesRequest接口

 public JsonResult Table([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestmodel)
  1. 先涂上任何搜索过滤器:

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;
    }
}
  1. 然后,使用应用分页SkipTake以前一样:

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

return Json(new DataTablesResponse(requestmodel.Draw, result, query.Count(), base.RefSureContext.CompanyType.Count()), JsonRequestBehavior.AllowGet);

这简化了所有的搜索,排序和分页到一个不错的易反复格局。

在对插件的文档是在这里 。



Answer 2:

由于您使用LINQ到SQL,分页是很容易的:

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

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

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

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

为了满足这个要求,你需要订购的服务器上查询一样,所以你需要的顺序标准发送到服务器和应用的顺序。

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

动态LINQ排序依据上的IEnumerable <T>



Answer 3:

小迟到了,但是这是值得分享:)

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


文章来源: JQuery DataTables server-side pagination