Реализация разбиения на страницы в ASP.NET Core 2.1 Web API - PullRequest
0 голосов
/ 14 сентября 2018

Я искал, но не нашел статей о том, как реализовать логику разбиения на страницы в приложении 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 

Должен ли я использовать метод GetAll(), добавив в него несколько http-параметров, или, скорее, создать новый метод? Нет большого смысла использовать page без pageSize, как мне с этим справиться?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Существуют библиотеки, такие как X.PagedList , которые вы можете использовать.Честно говоря, нумерация страниц довольно проста, так что вам это может даже не понадобиться.Все, что вам нужно знать, это номер страницы, размер страницы и общее количество результатов.Номер страницы очевиден из запроса, и размер страницы может также, если вы хотите, чтобы он настраивался, или вы можете жестко его кодировать.

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

Затем вы можете использовать Skip и Take для получения данных для конкретной страницы:

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;
0 голосов
/ 14 сентября 2018

Я только что создал PagingTagHelper для страниц ASP.NET Core Razor, чтобы легко отображать элемент управления подкачкой с помощью только основных параметров, простейшая настройка выглядит следующим образом:

<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 голосов
/ 14 сентября 2018

Прежде всего, вы можете установить значение 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-параметры, например: /api/Entires?$skip=5&$top=5

...