it-swarm.com.de

Implementieren Sie die Paginierung in der ASP.NET Core 2.1-Web-API

Ich habe nach Artikeln zum Implementieren der Paginierungslogik in einer ASP.NET WebAPI Core 2.1-Anwendung gesucht, sie jedoch nicht gefunden ...

Ich habe folgendes

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

Jetzt möchte ich, dass meine Einträge mit den neuen Parametern page und pageSize paginiert werden. Sagen

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

Soll ich die GetAll() -Methode verwenden, indem ich einige http-Parameter hinzufüge, oder stattdessen eine neue Methode erstellen? Es ist nicht sinnvoll, page ohne pageSize zu verwenden. Wie kann ich das handhaben?

6
Serge

Zuallererst können Sie Ihren pageSize -Wert auf etwas setzen:

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

    // do you pagination here
}

Sie können sich aber auch OData ansehen, es scheint Ihr Fall zu sein. Sie können Ihre Daten mit http-Parametern abfragen, z. B .: /api/Entires?$skip=5&$top=5

3
Alex Riabov

Es gibt Bibliotheken wie X.PagedList , die Sie verwenden können. Ehrlich gesagt ist die Paginierung ziemlich einfach, so dass Sie das vielleicht gar nicht brauchen. Alles, was Sie wissen müssen, ist die Seitenzahl, die Seitengröße und die Gesamtzahl der Ergebnisse. Die offensichtliche Seitenzahl ergibt sich aus der Anfrage, und die Seitengröße kann auch angepasst werden, oder Sie können sie hart codieren.

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

Dann können Sie Skip und Take verwenden, um die Daten für eine bestimmte Seite abzurufen:

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

Dann müssen Sie nur noch die Gesamtzahl der Seiten kennen, die einfach berechnet werden können über:

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

Daraus können Sie alles andere berechnen, das heißt:

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

Ich habe gerade einen PagingTagHelper für ASP.NET Core Razor-Seiten erstellt, um die Paging-Steuerung mit nur den grundlegenden Parametern zu vereinfachen. Das einfachste Setup sieht wie folgt aus:

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

sie müssen lediglich die Gesamtzahl der Datensätze und die Seitenzahl angeben, damit sie ausgeführt werden können. Die Standardparameter für die Abfragezeichenfolge sind "p" für die Seitenzahl und "s" für die Seitengröße. Sie können jedoch alle Einstellungen an Ihre Anforderungen anpassen.

sie können es von Nuget installieren:

Install-Package LazZiya.TagHelpers -Version 1.0.2

dann müssen Sie den Tag-Helfer zur Datei _ViewImports.cshtml hinzufügen:

@addTagHelper *, LazZiya.TagHelpers

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

weitere Dokumentationen und Live-Demos werden in Kürze verfügbar sein.

0
Laz Ziya