------------------- 更新答案 -------------- -----------------
为什么要更新?
这个答案似乎一直受到 SO 用户的广泛关注,我认为每个人都可以从“小”更新中受益。
到目前为止发生了什么变化?
DataTables.Mvc 一年多前开始。它已更改,现在称为DataTables.AspNet。但这还不是全部。
当时,目标是帮助基类。问题是您只需要一个 zip 文件,并且应该手动将所有内容合并到您的项目中。此外,模型没有绑定器,集成真的很无聊。
现在我们有了一个带有 Nuget 包的模块化架构来提供帮助。您可以参考Core 包并自己实现所有内容,或者您可以获得适当的包(Mvc5 或AspNet;WebApi2 即将推出)带有原生模型绑定器、单行注册和完整的测试套件。
如何开始?
查看 dev 分支 (click here) 上的 samples 文件夹。
不要忘记获取适当的 Nuget 包。你可以找到他们的名单here。
------------------ 原始答案 -------------- -----------------
首要任务
您可以将 DataTables 1.9、1.10 与旧 API 或 1.10 与新 API 一起使用。
如果您选择新的 API(仅限 1.10),那么您会到处错过一些插件,但您可以使用 DataTables.AspNet on GitHub 来帮助绑定。
如果没有,您可以查看并更改代码以匹配其他版本的请求变量(稍后将在我的项目中提供支持)。
真正的交易
重点是你必须处理三个项目:
- 全局过滤/搜索
- 列过滤/搜索
- 列排序
给我一些代码!
如果您使用(或不使用)我的绑定类,这可能会从哪个版本改变。考虑到你在使用它,为了避免在这里处理请求参数,好吗?
所以,你可以这样玩:
[HttpPost]
public ActionResult Index([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestParameters)
{
var totalCount = myDbContext.Set<Something>().Count();
var filteredDataSet = myDbContext.Set<Something>().Where(_s => _s.ToLower().Contains(requestParameters.Search.Value));
foreach(var column in requestParameters.Columns.GetFilteredColumns())
{
// Apply individual filters to each column.
// You can try Dynamic Linq to help here or you can use if statements.
// DynamicLinq will be slower but code will be cleaner.
}
var isSorted = false;
IOrderedEnumerable<Something> ordered = null;
foreach(var column in requestParameters.Columns.GetSortedColumns())
{
// If you choose to use Dynamic Linq, you can apply all sorting at once.
// If not, you have to apply each sort manually, as follows.
if (!isSorted)
{
// Apply first sort.
if (column.SortDirection == Column.SortDirection.Ascendant)
ordered.OrderBy(...);
else
ordered.OrderByDescending(...);
isSorted = true;
}
else
{
if (column.SortDirection == Column.SortDirection.Ascendant)
ordered.ThanBy(...);
else
ordered.ThanByDescending(...);
}
}
var pagedData = ordered.Skip(requestParameters.Start).Take(requestParameters.Length);
var dataTablesResult = new DataTablesResult(
requestParameters.Draw,
pagedData,
filteredDataSet.Count(),
totalCount
);
return View(dataTablesResult);
}