我在这里阅读了几篇文章以及Telerik网站上的教程,但它们缺乏 - 文档已关闭。 希望在阅读后数小时快速修复。
我正在尝试使用具有大量行(1M)的Kendo网格。在网站上的示例中,我看到视图控制器操作正在返回整个数据集。 获取所有行是非常昂贵的过程,并且数据集非常庞大。
我的问题是如何配置网格,以便每个后续回调都会返回下一页和,初始调用不会立即获取所有行?
我的代码类似于:
//Main controller action
public ActionResult Index()
{
List<items> listItems = GetAllItems(); // very expensive call!
return View(listItems);
}
// my view for that action
@(Html.Kendo().Grid(Model)
.Name("grid")
.Columns(columns =>
{
//some columns...
})
.Pageable(page=>page.PageSizes(true)) //Enable paging - I suspect here I can fix
.DataSource(datasource =>datasource.Ajax().PageSize(20).Read(read => read.Action("MoreItems", "Index")).ServerOperation(true)) // tried all sorts of things here
.Sortable()
.Filterable()
)
// the callbacks for the ajax
public ActionResult MoreItems([DataSourceRequest] DataSourceRequest request)
{
return Json(GetAllItems().ToDataSourceResult(request));
}
//add some cache just to see what was holding the thing up
[OutputCache(Duration = 3600, VaryByParam = "none")]
private static List<items> GetAllItems()
{
//some code to retrieve items
}
(从示例中看起来初始调用返回完整模型 - 后续对Products_Read的调用都在过滤器对象上。如何过滤初始调用但允许将来调页 - 在我的情况下我有100k +行,不可能做“返回视图(模型”))谢谢!
答案 0 :(得分:5)
对于剑道信息似乎并不是很幸运......您正在寻找的是serverPaging
(here中框架DataSource下的文档)。
对于服务器将收到的每个请求:
take
包含要检索的记录数skip
从数据集前面开始阅读的记录数page
当前数据页的索引pageSize
每页的记录数您也可以考虑使用scrollable.virtual
(here中的文档,在网格中向下滚动时会加载以下页面。
此示例(http://demos.kendoui.com/web/grid/remote-data.html)使用serverPaging
。
答案 1 :(得分:1)
您似乎不熟悉LINQ expression engine。永远不会检索整个集合。 ToDataSourceResult 方法正是这样做的 - 在数据库级别上应用分页/排序/分组(感谢该表达式引擎)。
你不需要做任何事情 - 只需将IQueryable集合(包含所有记录)传递给DataSourceResult,不要在此之前调用ToList(或任何类似的东西)或魔法将被破坏:)