5

状況

プロジェクトでMVC[サーバー側]にTrirandJQGridを使用しています。

1つのテーブルに50万を超えるレコードがあります。

このコードを呼び出してデータをロードします。これは、500000レコードのコレクションを提供するものです。

IEnumerable<myIndexViewModel> myviewmodel= _allincidents.Select(x => new myIndexViewModel
            {

                IncidentRequestStatus = x.RequestStatus,
                RequestByUserName = x.RequestByUserName,
                Subject = x.Subject

            });     
gridModel.JqGrid.DataBind(myviewmodel.AsQueryable());

JQgridは、クリックする次のページごとにjsonベースのajaxリクエストを非常にうまく処理します。

問題

jqgridが強制終了されるため、ページ読み込みイベントで50万件のレコードをまとめて読み込みたくありません。

特定のページの表示を要求するためにDBにストアドプロシージャを作成すると、myviewmodelコレクションにそのページのみが読み込まれます。

次のページがクリックされたときにDBからその場でページを取得するにはどうすればよいですか。これはjqgridでも可能ですか?

状況2

VIJAYとMARKからの回答に基づいて、彼らが示したアプローチは完全に正しいですが、ここではMVCのJQGRIDがメソッド呼び出しを行うためのDATAURLプロパティを設定します。この場合、そのIncidentGridRequestです。

グリッドの次のページまたは前のページがクリックされたときにページ番号を送信するにはどうすればよいですか?

incidentModel.IncidentGrid.DataUrl = Url.Action("IncidentGridRequest")

 public JsonResult IncidentGridRequest()
        {
         }
4

4 に答える 4

6

グリッドに結果を提供するコントローラーアクションは、jqGridからいくつかの追加情報を受け入れることができます。

    public ActionResult GetGridData(string sidx, string sord, int page, int rows, bool _search, string filters)

関心のある主な部分は、ページ、行です(sidxは列の並べ替え用、sordは並べ替え順序用、グリッドで検索が行われた場合は_search、その場合はフィルターに検索情報が含まれます)

結果を生成すると、次のことができるようになります。

IEnumerable<myIndexViewModel> myviewmodel = allincidents.Select(x => new myIndexViewModel
            {

            IncidentRequestStatus = x.RequestStatus,
            RequestByUserName = x.RequestByUserName,
            Subject = x.Subject

        }).Skip((page - 1) * rows).Take(rows)

PS。IEnumberableを使用してDBから大量のデータを移動するかどうかはわかりませんが、jqGridのデータのこのサブセットを生成するときにIQueryableを使用することをお勧めします。

編集:ページングの問題に対処するには、クエリ内の合計レコード数を計算し、その値をグリッドに渡す必要があります。例

int totalRecords = myviewmodel.Count();

その後、それをjSon値としてグリッドに渡します。元

    var jsonData = new
    {
        total = (totalRecords + rows - 1) / rows,
        page = page,
        records = totalRecords,
        userdata = new {SearchResultsFound = searchResultsFound},
        rows = (
        ......
于 2013-01-21T13:59:26.363 に答える
2

はい、たとえば、という名前の変数でめくりたいページ番号を受け入れていて、page変数にページのサイズがある場合、次のようにpageSizeなります。

IEnumerable<myIndexViewModel> myviewmodel = allincidents.Select(x => new myIndexViewModel
            {

                IncidentRequestStatus = x.RequestStatus,
                RequestByUserName = x.RequestByUserName,
                Subject = x.Subject

            }).Skip((page-1)*pageSize).Take(pageSize));

あなたにサイズの記録を与えるでしょpageSizeう。

于 2013-01-21T12:29:56.643 に答える
1

Trirand jqGrid for ASP.NET MVCは、メソッドIQueryable内のインターフェイスを使用して、JqGrid.DataBind()ページ、並べ替え、およびフィルタリングを実装しています。

したがって、ここで重要なのは、データベースレベルでこれらのタイプの操作を処理するデータソースを使用することです(必要なデータのみがフェッチされるようにデータベースへのSQLクエリを作成することによって)。すべての主要なORMがこのサポートを備えています。これには、LINQ-2-SQL、Entity Framework、NHbiernate、LLBLGenが含まれます。

このテクノロジーの1つを使用し、必要なコンテキストを直接JqGrid.DataBind()メソッドに渡す必要があります(サンプルで行うようにデータを手動で抽出する必要はありません)。

于 2013-01-21T14:46:09.407 に答える
0

PagedListライブラリ(Nugetから)を使用することによるより簡単なアプローチ。JosephSchragによる便利なブログがあります

    public JsonResult Users(int PageNo, int Rows)
    {
        var UserList = db.Users.Select(t => new
        {
            t.UserId,
            t.Username,
            t.Firstname,
            t.Lastname,
            t.Designation,
            t.Country,
            t.Email
        }).OrderBy(t => t.UserId);

        var pagedUserList = UserList.ToPagedList(PageNo, Rows);

        var results = new
        {
            total = pagedUserList.PageCount, //number of pages
            page = pagedUserList.PageNumber, //current page
            records = UserList.Count(), //total items
            rows = pagedUserList
        };
        return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
于 2013-03-17T11:28:10.700 に答える