ASP.NET Web API中把分页信息放Header中返回给前端

谈到ASP.NET Web API的分页,考虑的因素包括:

1、上一页和下一页的uri
2、总数和总页数
3、当前页和页容量

接着是服务端的数据以怎样的形式返回?

我们通常这样写:

{
    totalCount:10,
    result: [
        {id:1, name:"a"},
        {id:2, name:"b"}
    ]
}

以上,把分页相关和实体信息以json格式返回给前端。但在本篇,尝试另外一种方式:把分页信息放在Header中返回给前端。

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"
}

时间: 2024-11-13 19:24:28

ASP.NET Web API中把分页信息放Header中返回给前端的相关文章

如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function (data) { $('#banner_right').html(data); } }); 服务端需要在WebApiConfig.Register()中添加如下的代码 public static class WebApiConfig { public static void Register(Ht

水煮 ASP.NET Web API(1-2)在 WebForm 应用程序中添加 ASP.NET Web API

问题 怎么样将 Asp.Net Web Api 加入到 Asp.Net Web From 应用程序中 解决方案 在 Visual Studio 2013 中,创建新的 Web From,可以直接在"新建 ASP.NET 项目" 创建项目向导中,勾选 ASP.NET Web API ,将其加入进来.如图 1-2 所示. 图 1-2. 在Asp.NET 项目向导,同时选中 Web Form 和 Web API 因为可以通过 NuGet 添加 ASP.NET Web API ,所以使用&qu

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)

chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angularjs文章:http://chsakell.com/2015/08/23/building-single-page-applications-using-web-api-and-angularjs-free-e-book/ 这里记录下对此项目的理解.分为如下几篇: ● 对一个前端使用AngularJ

ASP.NET Web API路由系统:路由系统的几个核心类型

虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除了对System.Web.dll程序集的依赖,实现在ASP.NET Web API框架中的URL路由系统亦是如此.也就是说,ASP.NET Web API核心框架的URL路由系统与ASP.NET本身的路由系统是相对独立的.但是当我们采用基于Web Host的方式(定义在程序集System.Web.H

ASP.NET Web API MediaTypeFormatter

MediaTypeFormatter提供了HTTP Request body data与.Net类型之间的无缝转换. 什么是MediaType Media Type指的是HTTP header中的content-type,它定义了在HTTP Body中的数据的格式.Media Type也用于Http RequestHeader中的Accept头,表明改Request期望收到的Response的body的格式. 你可以使用标准的media type,比如application/json, appl

ASP.NET Web API——选择Web API还是WCF

WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WCF的设计主要是考虑SOAP和WS-*. WCF已经出现好多年了,相对来说ASP.NET Web API还是个小孩子,但是不意味着ASP.NET Web API要代替WCF,在不同的场合,它们各有长处.ASP.NET Web API非常轻量,在功能和灵活性上都不能和WCF相比.如果你的服务是基于TCP的,或者支持更多

细说Asp.Net Web API消息处理管道(二)

在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息处理管道的.本文在上篇的基础上进行一个补充,谈谈在WebHost寄宿方式和SelfHost寄宿方式下,请求是如何进入到Asp.Net Web API的消息处理管道的. WebHost寄宿方式: 在剖析Asp.Net WebAPI路由系统一文中,我们知道Asp.Net Web API在WebHost寄

购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证

原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证 chsakell分享了前端使用AngularJS,后端使用ASP.NET Web API的购物车案例,非常精彩,这里这里记录下对此项目的理解. 文章:http://chsakell.com/2015/01/31/angularjs-feat-web-api/http://chsakell.com/2015/03/07/angularjs-feat-web-api-