现有答案可能适用于旧版本的 dataTable,但当前版本(我使用的是 1.10+)传递了开始记录和长度,因此任何建议pageNo * pageSize
都会给出不正确的结果。
第一个简单的“手动”方法
接受的答案对于我想做的事情也很复杂,经过一些调试,我发现页面大小和开始记录只是作为Request
名为start
and的 Http 值传递length
。文本搜索被传递为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 包。
安装 NuGet 包
更改控制器 Action 以使用 aDataTablesBinder
提供 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
然后像以前一样使用and应用分页Take
:
例如
var result = query.Skip(requestmodel.Start).Take(requestmodel.Length).Select(x => new { x.CompanyTypeName, x.CompanyTypeDescription });
- 最后使用对象返回 JSON 结果
DataTablesResponse
:
例如
return Json(new DataTablesResponse(requestmodel.Draw, result, query.Count(), base.RefSureContext.CompanyType.Count()), JsonRequestBehavior.AllowGet);
这将所有搜索、排序和分页简化为一个易于重复的模式。
插件的文档在这里。