Kendo Ui Grid - 在初始请求中仅获取页面行数

时间:2013-02-17 19:27:54

标签: telerik kendo-ui kendo-grid

我在这里阅读了几篇文章以及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 +行,不可能做“返回视图(模型”))谢谢!

2 个答案:

答案 0 :(得分:5)

对于剑道信息似乎并不是很幸运......您正在寻找的是serverPaginghere中框架DataSource下的文档)。

对于服务器将收到的每个请求:

  • take包含要检索的记录数
  • skip从数据集前面开始阅读的记录数
  • page当前数据页的索引
  • pageSize每页的记录数

您也可以考虑使用scrollable.virtualhere中的文档,在网格中向下滚动时会加载以下页面。

此示例(http://demos.kendoui.com/web/grid/remote-data.html)使用serverPaging

答案 1 :(得分:1)

您似乎不熟悉LINQ expression engine。永远不会检索整个集合。 ToDataSourceResult 方法正是这样做的 - 在数据库级别上应用分页/排序/分组(感谢该表达式引擎)。

你不需要做任何事情 - 只需将IQueryable集合(包含所有记录)传递给DataSourceResult,不要在此之前调用ToList(或任何类似的东西)或魔法将被破坏:)