在Web Api中添加分页链接标题2

时间:2014-09-28 01:04:15

标签: c# pagination asp.net-web-api asp.net-web-api2

目前在我的Rest服务中,我使用下面的模型返回分页数据。

public class PagedResults<T>
{
    public List<LinkModel> Links { get; set; }
    public int TotalCount { get; set; }
    public double TotalPages { get; set; }
    public List<T> Results { get; set; }
}

这没关系,但我发现了以下帖子。

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pagination

我的好奇心达到顶峰,它提到使用HTTP标头返回链接和分页信息。虽然这篇文章提到了RFC 5988,但是我无法解读这究竟意味着什么?它是否真的被采纳为某种标准?

这里的问题是在ASP.Net Web API 2中,是否有任何支持在链接头中添加分页信息?我使用intellisense来仔细阅读HTTP响应标题,但我没有找到Links或类似的东西。

我发现了这篇文章,但它并没有真正回答我在Web API 2中轻松做到这一点的问题。

Link headers vs link elements for RESTful JSON

2 个答案:

答案 0 :(得分:14)

您可以查看我的post here,其中显示了如何将分页添加为“自定义”(X-Pagination)标题,下面是可能有用的示例代码:

 public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10)
{
    IQueryable<Student> query;

    query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName);

    var totalCount = query.Count();
    var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);

    var urlHelper = new UrlHelper(Request);
    var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : "";
    var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : "";

    var paginationHeader = new
    {
        TotalCount = totalCount,
        TotalPages = totalPages,
        PrevPageLink = prevLink,
        NextPageLink = nextLink
    };

    System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
    Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));

    var results = query
    .Skip(pageSize * page)
    .Take(pageSize)
    .ToList()
    .Select(s => TheModelFactory.CreateSummary(s));

    return results;
}

答案 1 :(得分:1)

在.Net MVC中添加链接头是微不足道的。根据{{​​3}},它们用逗号分隔,所以:

HttpContext.Response.Headers.Add("Link", string.Join(",", pagedResult.Links));
  

注意:pagedResultPagedResult<T>类的实例。

这可以与上面的Taiseer的X-Pagination标题一起使用。