前言

这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可能会在系列的后期介绍,还没确定。。。),对于分页的结果,我们将采用2种不同的方式响应给客户端(1.将分页元数据封装在响应Body中2.在http响应报文头部添加分页信息)。

众所周知,在服务器端一次性返回成百上千条数据是非常恐怖的,在我们设计Api的时候,对于Get方法我们应该以分页的方式返回。例如:每次响应给客户端10条数据,并且包含“上一页”和“下一页”的标签,这样用户就能去获得他想要的数据。

Way1.封装分页元数据封装在响应Body中

修改“CoursesController”的Get方法实现分页而不是一次性把所有数据返回,下面上代码:

public Object Get(int page = 0, int pageSize = 10){IQueryable<Course> query;query = TheRepository.GetAllCourses().OrderBy(c => c.CourseSubject.Id);var totalCount = query.Count();var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);var urlHelper = new UrlHelper(Request);var prevLink = page > 0 ? urlHelper.Link("Courses", new { page = page - 1 }) : "";var nextLink = page < totalPages - 1 ? urlHelper.Link("Courses", new { page = page + 1 }) : "";var results = query.Skip(pageSize * page).Take(pageSize).ToList().Select(s => TheModelFactory.Create(s));return new{TotalCount = totalCount,TotalPages = totalPages,PrevPageLink = prevLink,NextPageLink = nextLink,Results = results};}

解释一下上面的代码:

在Get方法上添加了2个有默认值的参数,这两个参数就是用来过滤我们查询结果集的——例如:我们想获取第2页的数据,那么对应的Get请求就应该是这种形式:http://localhost:{your_port}/api/courses/?page=1,注意:在这里我们只给了一个参数,那么pageSize就是默认值10.

客户端收到的部分响应就应该是:

{"totalCount": 32,"totalPages": 4,"prevPageLink": "http://localhost:3300/api/courses?page=0&pageSize=10","nextPageLink": "http://localhost:3300/api/courses?page=2&pageSize=10","results": [{"id": 11,"url": "http://localhost:3300/api/courses/11","name": "English Education 2","duration": 4,"description": "The course will talk in depth about: English Education 2","tutor": {"id": 4,"email": "Kareem.Ismail@outlook.com","userName": "KareemIsmail","firstName": "Kareem","lastName": "Ismail","gender": 0},"subject": {"id": 4,"name": "English"}},

Repository中GetAllCourses的返回值为IQueryable,因此在执行skip和take方法时并没有到SQL Server中执行SQL语句,最后查询的也是分页好的数据,体现出按需查询的特色。

在我们返回给客户端的数据中,其中分页元数据中包含了totalCount, totalPages, prevPageLink, nextPageLink这些数据,对于客户端来说我们返回totalCount, totalPages这两条数据非常有用,这样就可以与一些Grid配合使用来绑定结果。

通常来说我们会将分页元数据封装在响应Body中,对于开发者来说我们提供了所有分页信息。但有的API消费者因此只想获取它请求的数据而不需要分页元数据,那么他在解析响应结果是就会很费劲,因此这里出现了另一种方式来向客户端响应分页元数据——在响应报文头部附加分页元数据:Body部分只包含请求的资源,我们新增一个头部信息“X-Pagination”。

Way2.封装分页元数据到响应Header中

我们修改StudentsController来实现将分页元数据封装在Header中,使用这种方法后,需要分页元数据的客户端直接从Header部分获取,不需要的客户端直接解析响应的Body即可。

实现起来也非常简单,下面上代码:

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

这里我们添加了一个Header,里面包含一个Json序列化的分页元数据,客户端收到的响应:

总结

2种分页技术各有优劣,感觉碰到具体应用的时候再做选择了

ASP.NET Web Api 实现数据的分页相关推荐

  1. 利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理

    在Asp.net Web API中,对业务数据的分页查询处理是一个非常常见的接口,我们需要在查询条件对象中,定义好相应业务的查询参数,排序信息,请求记录数和每页大小信息等内容,根据这些查询信息,我们在 ...

  2. ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序

    目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新( ...

  3. ASP.NET Web API 记录请求响应数据到日志的一个方法

    原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-resp ...

  4. 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...

  5. ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题

    最近开发微信小程序中用到了微信支付功能,接口开发用的ASP.NET WEB API: 在支付成功后,接口接受到微信服务器的支付通知结果,处理完数据,接口返回给微信服务数据时出现了问题. 微信服务器识别 ...

  6. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...

  7. ASP.NET Web API 简介

    本周早些时候,我写过一篇关于 ASP. NET MVC 4 测试版的博文.ASP. NET MVC 4 是一个重大的更新,它带来了一堆出色的新功能.我最兴奋的改进之一是为创建"Web ApI ...

  8. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程

    最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...

  9. ASP.NET Web Api 教程

    使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[七]--实现资源的分页 摘要: 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.h ...

最新文章

  1. 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战
  2. Android——通知栏提示 app 更新的进度,更新完可以访问授权进行安装。适配 8.0 版本
  3. 用Unity快速开发太空飞机大战游戏实战经验分享(上)
  4. 三星gtn8010安卓7_三星Galaxy Note 10.1 N8010 最后的救赎 Andorid 5.0.2 ROM
  5. Python人工智能之路 - 第一篇 : 你得会点儿Python基础
  6. MATLAB2016b 下载,破解,安装
  7. nginx启动重启与升级以及检测配置文件
  8. bat 自动输入密码_「docker实战篇」python的docker爬虫技术移动自动化uiautomator工具(16)...
  9. 使用WndProc来处理消息
  10. 万能平板刷机软件_一加万能工具包(手机万能刷机工具)
  11. 用友T1-商贸宝库存商品明细账
  12. 获取随机数的n种方法,你知道几种
  13. 浙大图灵班今年首次招生:院士授课,本科生配学业导师
  14. 学会python,妈妈再也不用担心我乱花钱了!
  15. php 根号2计算过程,根号换算(开方计算器在线)
  16. 无线wifi打印机服务器原理,一般无线打印机的连接方法及遇到常见故障解决办法...
  17. H5的Notification特性
  18. oracle 12cR2 版本发布时间 2HCY2016
  19. 情人节,送女友一桶代码可否?
  20. 定制office2007静默安装版

热门文章

  1. c语言实现stack的算法(附完整源码)
  2. C/C++中extern的用法 ?
  3. php网站评论代码,PHP评论代码帮助
  4. web展现mysql_web页面实现LED跑马灯效果(涉及web前端、原生JS、PHP、mysql)
  5. kylin调优,项目中错误总结,知识点总结,kylin jdbc driver + 数据库连接池druid + Mybatis项目中的整合,shell脚本执行kylin restapi 案例
  6. Spring+Hibernate+Struts2整合所需要的Jar包
  7. android adb 联系人,使用adb命令向Android模拟器中导入通讯录联系人的方法
  8. 文件上传获取file的全路径名_Java中的File类与I/O流
  9. python连接各种数据库数据_Python连接各种数据库
  10. 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归