ASP.NET Web APIではページング情報をヘッダに入れてフロントエンドに戻す

3637 ワード


ASPについてNET Web APIのページングでは、1、前のページと次のページのuri 2、合計ページ数と合計ページ数3、現在のページとページ容量、次にサービス側のデータがどのように返されるかを考慮します.私たちは通常、{totalCount:10,result:[{id:1,name:“a”},{id:2,name:“b”}}以上と書き、ページング関連とエンティティ情報をjson形式でフロントエンドに返します.しかし本編では,ページング情報をヘッダに入れてフロントエンドに返す別の方法を試みる.
const int maxPageSize = 10;

[Route("api/items", Name="items")]
public IHttpActionResult Get(int page = 1, ing pageSize = 5)
{
    try
    {
        var items = _repo.GetItem()
            .sort()
            .Where();
            
        if(pageSize > maxPageSize)
        {
            pageSize = maxPageSize;
        }
        
        var totalCount = items.Count();
        var totalPages = (int)Math.Ceiling((double)totalCount/pageSize);
        
        var urlHelper = new UrlHelper(Request);
        var prevLink = page > 1 ? UrlHeloer.Link("items", new {
            page = page -1,
            pageSize = pageSize,
            ...
        }) : "";
        
        var nextLink = page < totalPages? urlHelper.Link("items", new {
            page = page + 1,
            pageSize = pageSize,
            ...
        }) : "";
        
        var paginationHeader = new 
        {
            currentPage = page,
            pageSize = pageSize,
            totalCount = totalCount,
            totalPages = totalPages,
            previousPageLink = prevLink,
            nextPageLink = nextLink
        };
        
        //  Header 
        HttpContext.Current.Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));
        
        var result = items
            .Skip(pageSize * (page - 1))
            .Take(pageSize)
            .ToList()
            .Select(e => ItemFactory.CreateItem(e));
            
        return Ok(result);
            
    }
    catch(Exception)
    {
        //TODO:    
    }
}

 
クライアントは、localhost:4321/api/items?page=2&pagesize=2応答にはX-Paginationプロパティがあります.X-Pagination:{"currentPage":2,"pageSize":2,"totalPages":4,"previousPageLink":"http://localhost:4321/api/items?page=1&pageSize=2"    "nextPageLink":"http://localhost:4321/api/items?page=3&pageSize=2"}