在我的web应用程序我使用jQuery 数据表插件,显示了从数据库检索数据。
我目前使用的客户端分页,但在我的表中的数据会成长很多,和装载在ASP.NET页面正在成为一个有点慢。 所以我打算切换到服务器端分页。
我知道,数据表插件支持它,但搜索周围我还没有找到明确无一不关于实现它。
我的主要疑问是:如果我实现服务器端分页我也必须执行顺序,或者我可以把它委托给客户端?
你有没有经历过这样的?
注:我使用的LINQ to SQL连接到我的数据库
在我的web应用程序我使用jQuery 数据表插件,显示了从数据库检索数据。
我目前使用的客户端分页,但在我的表中的数据会成长很多,和装载在ASP.NET页面正在成为一个有点慢。 所以我打算切换到服务器端分页。
我知道,数据表插件支持它,但搜索周围我还没有找到明确无一不关于实现它。
我的主要疑问是:如果我实现服务器端分页我也必须执行顺序,或者我可以把它委托给客户端?
你有没有经历过这样的?
注:我使用的LINQ to SQL连接到我的数据库
现有的答案可能适用于旧版本的DataTable的,但目前的版本(我使用1.10+)传递开始记录和长度,所以,只要提示pageNo * pageSize
是要给不正确的结果。
接受答案也是为了什么,我想这样做很复杂,一些调试后,我发现,页面大小,并开始记录只是作为传递的Http Request
命名值start
和length
。 文本搜索作为传递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包。
安装NuGet包
改变控制器操作使用DataTablesBinder
提供IDataTablesRequest接口
如
public JsonResult Table([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestmodel)
如
if (!string.IsNullOrEmpty(requestmodel.Search.Value))
{
query = query.Where(x => x.CompanyTypeName.Contains(requestmodel.Search.Value) || x.CompanyTypeDescription.Contains(requestmodel.Search.Value));
}
如
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
和Take
以前一样: 如
var result = query.Skip(requestmodel.Start).Take(requestmodel.Length).Select(x => new { x.CompanyTypeName, x.CompanyTypeDescription });
DataTablesResponse
对象: 如
return Json(new DataTablesResponse(requestmodel.Draw, result, query.Count(), base.RefSureContext.CompanyType.Count()), JsonRequestBehavior.AllowGet);
这简化了所有的搜索,排序和分页到一个不错的易反复格局。
在对插件的文档是在这里 。
由于您使用LINQ到SQL,分页是很容易的:
var c = new MyDataContext("your string");
c.Employees.Skip(pageIndex * pageSize).Take(pageSize);
此代码将有效分页服务器上
我没有使用过的数据表 jQuery插件,但我假设你使用AJAX来获取数据(因为你没有使用MVC),所以只需发送作为参数当前页面的索引,以及每页行数-页面大小,这就是它
为了满足这个要求,你需要订购的服务器上查询一样,所以你需要的顺序标准发送到服务器和应用的顺序。
要订购根据服务器上的string
,请检查以下问题:
动态LINQ排序依据上的IEnumerable <T>
小迟到了,但是这是值得分享:)
Employees
.OrderBy(sortColumn + " " + sortOrder)
.Skip(pageNo * pageSize)
.Take(pageSize)
.ToList();