web-dev-qa-db-fra.com

Implémenter la pagination dans l'API Web ASP.NET Core 2.1

J'ai cherché, mais je n'ai pas vraiment trouvé d'articles sur la façon d'implémenter la logique de pagination dans une application ASP.NET WebAPI Core 2.1 ...

J'ai le suivant

[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;
    }

Maintenant, je veux que mes entrées soient paginées en utilisant de nouveaux paramètres page et pageSize. Dire

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

Dois-je utiliser la méthode GetAll() en y ajoutant des paramètres http, ou plutôt créer une nouvelle méthode? Il n'y a pas beaucoup de sens à utiliser page sans pageSize, comment gérer cela?

6
Serge

Tout d'abord, vous pouvez par défaut vous pageSize valeur à quelque chose:

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

    // do you pagination here
}

Mais vous pouvez également regarder OData , cela semble être votre cas. Il vous permettra d'interroger vos données à l'aide de paramètres http, par exemple: /api/Entires?$skip=5&$top=5

3
Alex Riabov

Il existe des bibliothèques, telles que X.PagedList que vous pouvez utiliser. Franchement, la pagination est assez simple, donc vous n'en aurez peut-être même pas besoin. Tout ce que vous devez savoir est le numéro de page, la taille de la page et le nombre total de résultats. Le numéro de page évident provient de la demande, et la taille de la page peut également, si vous le souhaitez personnalisable, ou vous pouvez le coder en dur.

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

Ensuite, vous pouvez utiliser Skip et Take pour obtenir les données d'une page particulière:

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

Ensuite, tout ce que vous devez savoir est le nombre total de pages, qui peut être calculé simplement via:

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

À partir de cela, vous pouvez calculer tout ce dont vous avez besoin, à savoir:

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

Je viens de créer un PagingTagHelper pour les pages ASP.NET Core Razor pour rendre le contrôle de la pagination facilement avec juste les paramètres de base, la configuration la plus simple ressemble à ci-dessous:

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

il vous suffit de fournir le nombre total d'enregistrements et le numéro de page pour qu'il s'exécute. Les paramètres de chaîne de requête par défaut sont "p" pour le numéro de page et "s" pour la taille de la page, cependant, il est personnalisable/localisable, vous pouvez modifier tous les paramètres selon vos propres besoins.

vous pouvez l'installer depuis nuget:

Install-Package LazZiya.TagHelpers -Version 1.0.2

vous devez ensuite ajouter l'assistant de balise au fichier _ViewImports.cshtml:

@addTagHelper *, LazZiya.TagHelpers

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

d'autres documentations et démos en direct seront bientôt disponibles.

0
Laz Ziya