web-dev-qa-db-ja.com

ASP.NET Core 2.1 Web APIでページネーションを実装する

検索しましたが、ASP.NET WebAPI Core 2.1アプリケーションでページネーションロジックを実装する方法に関する記事は実際には見つかりませんでした...

私は次のものを持っています

_[Route("api/[controller]")]
[ApiController]
[EnableCors("AllowMyOrigin")]
public class EntriesController : ControllerBase
{
    private readonly EntriesContext _context;

    public EntriesController(EntriesContext context) {
        _context = context;

        if (_context.Entries.Count() == 0) {
            _context.Entries.Add(new Entry { From = "default", To = "default" });
            _context.SaveChanges();
        }
    }

    [HttpGet]
    public ActionResult<List<Entry>> GetAll() {
        return _context.Entries.ToList();
    }

    [HttpGet("{id}", Name = "GetEntry")]
    public ActionResult<Entry> GetById(long id) {
        var item = _context.Entries.Find(id);
        if (item == null) { return NotFound(); }
        return item;
    }
_

ここで、新しいパラメータpageおよびpageSizeを使用して、エントリをページ分割する必要があります。いう

_/api/entries?pageSize=3&page=2 
_

Http paramsを追加してGetAll()メソッドを使用するか、新しいメソッドを作成する必要がありますか? pageなしでpageSizeを使用する意味はありません。これをどのように管理しますか?

6
Serge

まず、デフォルトのpageSize値を何かに設定できます:

[HttpGet]
public ActionResult<List<Entry>> GetAll(int? page = null, int? pageSize = 10) 
{
    if (!page.HasValue) {
        return _context.Entries.ToList();
    }

    // do you pagination here
}

しかし、あなたは OData を見るかもしれません、それはあなたの場合のようです。 http paramsを使用してデータをクエリできます。例:/api/Entires?$skip=5&$top=5

3
Alex Riabov

X.PagedList などのライブラリが使用できます。率直に言って、ページネーションは非常に簡単ですので、あなたもそれを必要としないかもしれません。知っておく必要があるのは、ページ番号、ページサイズ、および結果の総数です。ページ番号はリクエストから明らかになり、ページサイズもカスタマイズできます。または、ハードコードすることもできます。

public ActionResult<List<Entry>> GetAll(int page = 1, int size = 10)

次に、SkipTakeを使用して、特定のページのデータを取得できます。

var query = _context.Entries;
var entries = await query.Skip((page - 1) * size).Take(size).ToListAsync();
var count = await query.CountAsync();

次に、知る必要があるのはページの総数だけです。これは、次の方法で簡単に計算できます。

var totalPages = (int)Math.Ceil(count / (float)size);

それから、あなたが必要とする他のものを計算することができます、すなわち:

var firstPage = 1; // obviously
var lastPage = totalPages;
var prevPage = page > firstPage ? page - 1 : firstPage;
var nextPage = page < lastPage ? page + 1 : lastPage;
17
Chris Pratt

ASP.NET Core Razorページ用のPagingTagHelperを作成し、基本的なパラメーターだけでページングコントロールを簡単にレンダリングしました。最も簡単なセットアップは次のようになります。

<paging total-records="Model.TotalRecords" page-no="Model.PageNo">
</paging>

必要なのは、実行する合計レコードとページ番号を提供することだけです。デフォルトのクエリ文字列パラメーターは、ページ番号の「p」およびページサイズの「s」ですが、カスタマイズ可能/ローカライズ可能であり、必要に応じてすべての設定を変更できます。

nugetからインストールできます。

Install-Package LazZiya.TagHelpers -Version 1.0.2

次に、タグヘルパーを_ViewImports.cshtmlファイルに追加する必要があります。

@addTagHelper *, LazZiya.TagHelpers

http://ziyad.info/en/articles/21-Paging_TagHelper_for_ASP_NET_Core

より多くのドキュメントとライブデモがまもなく利用可能になります。

0
Laz Ziya