2017-01-29 15 views
1

PagedListを使用して、検索支払い結果ページのページングを表示しています。私は各ページに5回の支払いしか表示しません。私がテストしている検索基準は15レコードを返します。私はページ番号1,2,3を持つ最初のページに5つのレコードしかないと考えています。一番下のページ番号が期待どおりに表示されますが、すべてのページに15個のレコードが表示されます。私は、以下に示すようなコードをデバッグし、StaticPagedList機能が代わり5.私のコントローラのアクションコードの15件のレコードを返していることが判明している:ASP.Net MVC PagedListが正しく機能しない

public ViewResult ViewPayment(int? billerId, int? billAccount, int? page) 
{ 
    var pageIndex = (page ?? 1) - 1; 
    var pageSize = 5; 

    List<Payment> paymentList = new List<Payment>(); 
    paymentList = _paymentBusiness.GetPayments(billerId, billAccount); 
    var paymentsAsIPagedList = new StaticPagedList<Payment>(paymentList, pageIndex + 1, pageSize, paymentList.Count); 

    ViewBag.OnePageOfPayments = paymentsAsIPagedList; 

    return View(paymentList); 
} 

私は何も間違っている場合は私に知らせてください。

+0

あなたは5つのレコードだけを正しく返しますが、 'ViewBag.OnePageOfPayments'にそれを割り当て、' return View(paymentList);を使って15個のレコードすべてをビューに返す 'StaticPagedList'を使用しています'ビューを返す(paymentsAsIPagedList);')。しかし、 'payList.Count'を使うと非常に効率が悪いです。' GetPayments() 'メソッドは' List 'で' IQueryable 'ではないので、効率的なページングの目的を破ってコレクション全体をメモリにロードしました –

+0

'IQueryable'を返すメソッドを使い、' .Count() 'を使って要素の総数を取得する必要があります。 –

+0

おススメのおかげでありがとう!私はそれを効率的にするためにコメントごとに修正するつもりです。 –

答えて

2

ビジネス層の5つのレコードのみを照会する必要があります。今すぐあなたはページ番号などを渡していません。とにかくそれらのうちのいくつかだけを表示するつもりなら、それらのすべてを照会するのはちょっとの無駄です。

public ViewResult ViewPayment(int? billerId, int? billAccount, int? page) 
{ 
    int pageNum = page ?? 1; 
    int pageSize = 5; 

    IPagedList<Payment> paymentPage = _paymentBusiness.GetPayments(billerId, billAccount, page, pageSize); 

    return View(paymentPage); 
} 

// Business layer 
public IPagedList<Payment> GetPayments(int? billerId, int? billAccount, int page, int pageSize) 
{ 
    IQueryable<Payment> payments = db.Payments.Where(p => ....).OrderBy(p => ...); 

    return new PagedList<Payment>(payments, page, pageSize); 
} 

私は上記のようなことをお勧めします。それを変更して、ビジネス/データ層がページリストを返すようにします。 5つの結果と2つのクエリで合計数を取得し、コントローラをページモデルに戻すことができます。

この例では、Skip()およびTake()を内部的に実行するPagedList<T>を使用してページを取得します。ページを作成する前に結果を注文することを忘れないでください。重要なこと

、今私たちは、データベースからすべての項目は、我々が興味を持っている小さなサブセットのみを取得していない。

あなたは、例えば使用している場合プレーンなSQLを使用する必要がありますADO.NETは、次のようなクエリを使用することができます。

オフセット
SELECT * FROM Payments ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY; 

(page - 1) * pageSizeに設定する必要があり、その数は後に次のページのサイズですFETCH。 SQL Server 2012以降でのみ動作します。他のデータベースにも同様の能力があります。

また、ADO.NETを使用すると、手動で必要な2つのクエリ(ページ+合計数)をPagedListの代わりにStaticPagedListにする必要があります。これにより、サブセットを直接与えることができます。

+0

私たちはADO.NETを使用しており、ビジネスレイヤーから支払いリストを取得しています。 ADO.NETを使用してサブセットをフェッチできますか? –

+0

はい、プレーンSQLで改ページできます。すばらしいSQL Server 2012の方法については、この回答を確認してください。http://stackoverflow.com/a/10639172/1658906受け入れられた答えをチェックして、古いもので動作するものを探します。 – juunas

+0

これはまったく必要ではありません。 OPは既に '.Skip()'と '.Take()'を使用している 'StaticPagedList'を使用しています –

1

PagedList(非同期メソッドを提供しない)を使用する別の方法として、DataTables.net(https://datatables.net)を使用する方法があります。

これはページテーブル用のクライアントサイドのJavaScriptフレームワークであり、非常に低いレベルに設定することができます。これにより、必要なものを実行できるようになり、カスタムソート、キャッシング、検索などの機能をそのまま使用できます。

私は過去にPagedListライブラリを使用していて、DataTables.Netを発見して以来、私は振り返っていません。素晴らしい図書館で、あなたの人生を楽にしてくれます。

関連する問題