我花了几个月的时间来计算使用 Kendo DataSource 和 Kendo Grid 的服务器端分组。分页、排序和过滤相当容易。但无论出于何种原因,Telerik 都没有为分组这样的关键 LOB 流程提供足够的支持文档。很高兴您发布了这个问题,以便我有机会分享我的代码。
解决方案
基本上,解决方案归结为了解 2 个关键部分,可以在以下示例项目中查看它们:https://www.dropbox.com/s/ygtk8rwl1hwjvth/KendoServerGrouping.zip?dl=0
您正在下载的 Visual Studio (2012 | 2013) 解决方案中有一个 Web 应用程序项目,其中包含对 Kendo.Mvc 库的引用。您可以从 Telerik 的控制面板安装程序下载最新的 UI for ASP.NET 二进制文件。安装后二进制文件将位于以下 Windows 目录中:C:\Program Files (x86)\Telerik\UI for ASP.NET MVC [Telerik Release Version]\wrappers\aspnetmvc\Binaries\ [您的 MVC 版本]\Kendo.Mvc.dll.
注意:我的解决方案使用 Telerik 的 MVC 传输机制,它提供了成熟的服务器端分页、过滤、排序以及最显着的分组。 但是,我使用纯 JavaScript 来配置 Kendo DataSource 而不是 MVC 包装器。不过,我最近在 Telerik 的文档中found a link 显示了 Razor/ASPX 中的 MVC 包装器声明。
服务器魔法
基本上,magic 的第一部分是以下服务器端代码,位于 KendoServerGrouping.Web\Controllers 中的示例 WebApi 控制器中strong> 目录:
[System.Web.Http.AcceptVerbs("GET", "ASPNETMVC-AJAX")]
public Kendo.Mvc.UI.DataSourceResult GetAllAccounts([System.Web.Http.ModelBinding.ModelBinder(typeof(WebApiDataSourceRequestModelBinder))] Kendo.Mvc.UI.DataSourceRequest request)
{
var kendoRequest = new Kendo.Mvc.UI.DataSourceRequest
{
Page = request.Page,
PageSize = request.PageSize,
Filters = request.Filters,
Sorts = request.Sorts,
Groups = request.Groups,
Aggregates = request.Aggregates
};
// Set this to your ORM or other data source
IQueryable accounts = dbContext.Accounts;
/*
The data source can even be a MongoDB collection using the
.AsQueryable() extension and the MongoDB C# driver
var accounts = collection.FindAllAs<Account>().AsQueryable();
*/
var data = accounts.ToDataSourceResult(kendoRequest);
var result = new DataSourceResult()
{
AggregateResults = data.AggregateResults,
Data = data.Data,
Errors = data.Errors,
Total = data.Total
};
return result;
}
这就是当用户与之交互时网格将自动处理的四个服务器端操作中的任何一个所需要的全部内容。特别注意方法上方的AcceptVerbs属性;它必须包含 “ASPNETMVC-AJAX” 属性,DataSourceRequest 输入参数才能正常工作。 ToDataSourceResult() 是最新版本的 Kendo.Mvc.dll 库提供的扩展,我之前指出过。
上面的代码(据我所知)适用于任何 IQueryable 数据源,例如来自 ORM 的那些(我已经测试了实体框架和 Telerik 数据访问/开放访问)。我还能够使用 MongoDB C# 驱动程序对 MongoDB 集合进行分组。但是,这只是概念验证,尚未经过性能测试。
就本示例而言,WebAPI 控制器中有静态数据源来伪造 IQueryable 集合。当然,您可以在换入自己的数据源后删除第 45-57 行的静态数据。
客户魔法
Kendo DataSource 自动从网格传入一个专门的 DataSourceRequest 对象,该对象包含服务器端分页、过滤、排序和分组的所有参数,提供你包装你的以下 JavaScript 中的 DataSource 架构:
schema: $.extend(true, {}, kendo.data.schemas["aspnetmvc-ajax"], {
});
这可能是我追踪到的最难以捉摸的一行代码。 在几个月的时间里,与 Telerik 进行了十几次交流,才让他们把它弄出来。即便如此,它被揭露也纯属偶然。为什么他们的文档中没有如此重要的细微差别,我无法理解。
仔细查看index.html 文件下半部分的每个 Kendo DataSource 配置设置。最重要的是,请注意不存在的内容,例如 batch 和 mvcTransport 选项。包含后一个选项会以某种方式否定上述 “aspnetmvc-ajax” 架构属性。
在 DataSource 的 parmaterMap 函数中,请注意,当且仅当 - 执行读取操作时,必须存在以下行:
return mvcTransport.parameterMap(options, operation);
您还需要确保在数据源执行之前将其包含在您的 HTML 中:
<script src="//cdn.kendostatic.com/[Version]/js/kendo.aspnetmvc.min.js"></script>
最终结果
运行 KendoServerGrouping.Web 项目 (index.html),如果一切顺利,网格将填充 5 条包含 AccountId 的记录strong>、AccountName、AccountTypeCode 和 CreatedOn 字段。如果将可见网格行数设置为 2 并按 AccountTypeCode 或 CreatedOn 分组,您会看到分组遍历分页,我相信这是您正在寻找的最终结果。
我希望示例项目能够正常工作并且非常适合您的情况。如果您有任何问题,请告诉我,我会尽力提供帮助。
附:这是我在 SO 上的第一篇文章,所以如果某些内容不符合 SO 标准,请对我放轻松。祝你好运!