Пагинация не возвращает никаких результатов в DotNetCore 3.0 - PullRequest
0 голосов
/ 19 марта 2020

Я добавил пейджинг к своим заголовкам в DotNetCore 3.0 и следовал видеоуроку по Udemy, чтобы сделать это, но он не возвращает никаких результатов в ответе. До того, как я добавил пейджинг, это работало нормально и возвращало пользователей, но после добавления заголовков ответ о статусе - 200 ОК, как и ожидалось, но результатов нет.

Это изменяет заголовки, чтобы они возвращали размер страницы, текущую страницу и т. Д. c (здесь я подозреваю, что проблема в том, что camelCaseFormatter также не применяется):

public static void AddPagination(this HttpResponse response, int currentPage, int itemsPerPage, int totalItems, int totalPages) {
    var paginationHeader = new PaginationHeader(currentPage, itemsPerPage, totalItems, totalPages);
    var camelCaseFormatter = new JsonSerializerSettings();
    camelCaseFormatter.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
    response.Headers.Add("Pagination", JsonConvert.SerializeObject((paginationHeader, camelCaseFormatter)));
    response.Headers.Add("Access-Control-Expose-Headers", "Pagination");
}

Это контроллер пользователей, который выполняет работу по фактическому извлечению пользователей из БД:

[HttpGet]
public async Task<IActionResult> GetUsers([FromQuery]UserParams userParams) {
    var users = await _repo.GetUsers(userParams);
    var usersToReturn = _mapper.Map<IEnumerable<UserForListDto>>(users);
    Response.AddPagination(users.CurrentPage, users.PageSize, users.TotalCount, users.TotalPages);
    return Ok(usersToReturn);
}

Это Repo (поэтому вызов GetUsers выше):

public async Task<PagedList<User>> GetUsers(UserParams userParams)
{
   var users = _context.Users.Include(p => p.Photos);
   return await PagedList<User>.CreateAsync(users, userParams.PageSize, userParams.PageSize);
}

Метод CreateAsyn c и класс PagedList:

public class PagedList<T> : List<T>
{
    public int CurrentPage { get; set; }
    public int TotalPages { get; set; }
    public int PageSize { get; set; }
    public int TotalCount { get; set; }

    public PagedList(List<T> items, int count, int pageNumber, int pageSize)
    {
        TotalCount = count;
        PageSize = pageNumber;
        CurrentPage = pageNumber;                
        TotalPages = (int)Math.Ceiling(count / (double) pageSize);
        this.AddRange(items);
    }

    public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source, int pageNumber, int pageSize) {
          var count = await source.CountAsync();
          var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();
          return new PagedList<T>(items, count, pageNumber, pageSize);
     }
} 

И Наконец, класс UserParams, используемый для вычисления pageSize et c.

public class UserParams
{
    private const int MaxPageSize = 50;
    public int PageNumber { get; set; } = 1;
    private int pageSize = 10;
    public int PageSize
    {
        get { return pageSize; }
        set { pageSize = (value > MaxPageSize) ? MaxPageSize : value; }
    }

}

В результате я получаю от Postman статус Status 200 OK с пустым JSON объектом ([]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...