4

ここでいくつかの投稿とTelerikWebサイトのチュートリアルを読みましたが、それらは不足しています-そしてドキュメントはオフになっています。何時間も読んだ後の迅速な修正を望んでいます。

大量の行(1M)の剣道グリッドを使用しようとしています。サイトの例では、ViewControllerアクションがデータセット全体を返していることがわかります。すべての行をフェッチすることは非常にコストのかかるプロセスであり、データセットは膨大です。

私の質問は、後続のすべてのコールバックが次のページを返し、最初の呼び出しがすべての行を一度にフェッチしないようにグリッドを構成するにはどうすればよいですか?

私のコードは次のようになります。

//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以上の行がありますそして、「return View(model」)を行うことは不可能です)ありがとう!

4

2 に答える 2

5

剣道の情報ではあまり幸運ではなかったようです...あなたが探しているものは呼ばれています(ここserverPagingのフレームワークデータソースの下のドキュメント)。

リクエストごとに、サーバーは以下を受け取ります。

  • take取得するレコードの数が含まれます
  • skipデータセットの先頭から読み取りを開始するレコードの数
  • pageデータの現在のページのインデックス
  • pageSize1ページあたりのレコード数

グリッドを下にスクロールしているときに次のページが読み込まれる、 (ここscrollable.virtualにあるドキュメント)の使用を検討することもできます。

この例(http://demos.kendoui.c​​om /web/grid/remote-data.html )はを使用しserverPagingます。

于 2013-02-17T19:53:59.187 に答える
2

LINQ式エンジンに精通していないようです。コレクション全体が取得されることはありません。ToDataSourceResultメソッドはまさにこれを実行しています-データベースレベルでページング/並べ替え/グループ化を適用します(その式エンジンのおかげで)。

何もする必要はありません-IQueryableコレクション(すべてのレコードを保持する)をDataSourceResultに渡すだけで、これ(または同様のもの)の前にToListを呼び出さないでください。そうしないと、魔法が壊れます:)

于 2013-02-17T20:04:09.440 に答える