gpt4 book ai didi

c# - JQuery DataTables 服务器端分页

转载 作者:太空狗 更新时间:2023-10-29 20:05:35 25 4
gpt4 key购买 nike

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

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

我知道DataTables插件是支持的,但是搜索了一下,没发现具体实现的问题。

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

你有过这样的经历吗?

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

最佳答案

现有答案可能适用于旧版本的数据表,但当前版本(我使用的是 1.10+)通过了起始记录和长度,因此任何提示 pageNo * pageSize 将给出不正确的结果。

第一个简单的“手动”方法

接受的答案对于我想做的也很复杂,经过一些调试,我发现页面大小和开始记录只是作为名为 start 的 Http Request 值传递长度。文本搜索作为 search[value] 传递 排序顺序在名为 order[0][column] 的成员中传递,排序方向在 order[ 0][dir]

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

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

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 for MVC5”)

一旦我了解了服务器端数据表的基础知识,就该开始寻找现有的插件/实用程序来简化此代码了。到目前为止,我找到的最适合 MVC 5 的是 Datatables.net for MVC5。 nuget 包。

  1. 安装 NuGet 包

  2. 更改 Controller Action 以使用 DataTablesBinder 来提供 IDataTablesRequest 接口(interface)

例如

 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. 最后使用 DataTablesResponse 对象返回 JSON 结果:

例如

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

这将所有搜索、排序和分页简化为一种易于重复的模式。

documentation for the addin is here .

关于c# - JQuery DataTables 服务器端分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com