【问题标题】:Kendo Ui Grid - fetching only page number of rows on the inital requestKendo Ui Grid - 在初始请求中仅获取页数的行
【发布时间】:2013-02-02 05:22:10
【问题描述】:

我已经阅读了这里的几篇文章以及 Telerik 网站上的教程,但是缺少它们 - 并且文档已关闭。 希望在阅读数小时后快速修复。

我正在尝试使用具有大量行 (1M) 的剑道网格。在网站上的示例中,我看到视图控制器操作正在返回整个数据集。 获取所有行是非常昂贵的过程,并且数据集非常庞大。

我的问题是如何配置网格,以使每个后续回调都返回下一页并且初始调用不会一次获取所有行?

我的代码类似于:

//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+ 行并且不可能执行“返回 View(model”) )谢谢!

【问题讨论】:

标签: telerik kendo-ui kendo-grid


【解决方案1】:

似乎对剑道信息不太幸运...您要查找的内容称为serverPaginghere 中的框架DataSource 下的文档)。

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

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

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

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

【讨论】:

  • 不错!我想这就是我需要的。此外,我很难找到有关如何使用带有 Razor 语法的控件的下降文档。该网站正在向我发送圈子。您是否知道我在哪里可以获得所有 razor 语法文档以及将这些控件与 razor 语法一起使用的多个示例?
【解决方案2】:

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

您无需执行任何操作 - 只需将 IQueryable 集合(包含所有记录)传递给 DataSourceResult,不要在此之前调用 ToList(或任何类似内容),否则魔法将被打破 :)

【讨论】:

  • 问题是我不仅在做数据库查询,还对存储进行查询,如果我必须列出存储中的所有项目,这仍然需要很长时间......无论如何都要填充一些虚拟数据?
  • 我不明白你的意思,你能澄清一下吗?
  • 我没有使用实体或可以进行延迟加载的东西。我正在通过网络获取文件结构、属性、元数据等。这很慢,所以我想在网格中有一些虚拟数据,并且只有当网格显示该页面并且 ajax 回调到服务器时对于过滤,实际查找这些文件。问题是我不能只向网格发送“1 页”的数据,并让网格不断请求额外的页面。网格只会显示这一页,而不会继续向服务器发出请求以获取下一页。
  • 我希望能够将网格配置为拥有 1000 行,而最初只发送 20 行,如果网格请求下一页,然后通过网络获取数据。在 99.9999% 的情况下,前 3-10 页数据就足够了,但我仍然需要能够查询所有数据。
  • 可惜你没有使用延迟加载。那么为什么要通过该 Collection 进行初始绑定呢?您可以简单地使用@(Html.Kendo().Grid()。我真的失去了重点。还要记住,Grid 实际上只序列化第一页的记录。按 ctrl+U 检查呈现的初始页面。还可以使用网络选项卡检查 Ajax 调用并查看只有单个页面的记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多