//创建分页的url private string CreateArticleUrl(ArticlePrameters articlePrameters, PaginationUrlType paginationUrlType) { switch (paginationUrlType) { case PaginationUrlType.PreviousPage: var CurrentPrameter = new ArticlePrameters { PageIndex = articlePrameters.PageIndex - 1, PageSize = articlePrameters.PageSize, OrderBy = articlePrameters.OrderBy, Fields = articlePrameters.Fields }; return(Url.Link("GetArticles", CurrentPrameter)); case PaginationUrlType.NextPage: var NextPrameter = new ArticlePrameters { PageIndex = articlePrameters.PageIndex + 1, PageSize = articlePrameters.PageSize, OrderBy = articlePrameters.OrderBy, Fields = articlePrameters.Fields }; return(Url.Link("GetArticles", NextPrameter)); default: var PreviousPrameter = new ArticlePrameters { PageIndex = articlePrameters.PageIndex, PageSize = articlePrameters.PageSize, OrderBy = articlePrameters.OrderBy, Fields = articlePrameters.Fields }; return(Url.Link("GetArticles", PreviousPrameter)); } }
public async Task <IActionResult> Get(ArticlePrameters articlePrameters) { //验证排序字符串 if (!PropertyMappingContainer.ValidateMappingExistsFor <ArticleViewModel, Article>(articlePrameters.OrderBy)) { return(BadRequest("排序的属性不存在!")); } //验证资源塑形字符串 if (!TypeHelper.TypeHasProperties <ArticleViewModel>(articlePrameters.Fields)) { return(BadRequest("请求的属性不存在!")); } var ArticlesList = await Repository.GetAllArticleAsync(articlePrameters); //将Article映射到ArticleModel var ArticlesResource = Mapper.Map <IEnumerable <Article>, IEnumerable <ArticleViewModel> >(ArticlesList); //根据fields进行资源塑形 var ArticlesAfterShaping = ArticlesResource.ToDynamicIEnumerable(articlePrameters.Fields); //为每一个资源添加links属性 ArticlesAfterShaping = ArticlesAfterShaping.Select(x => { x.TryAdd("links", CreateHateoasLinks((int)x.Where(y => y.Key == "Id").FirstOrDefault().Value, articlePrameters.Fields)); return(x); }); //新建匿名类存放翻页元数据 var page = new { ArticlesList.PageSize, ArticlesList.PageIndex, ArticlesList.TotalItemsCount, ArticlesList.PageCount }; //为资源创建前后页链接 var links = CreateHateoasLinksForPages(articlePrameters, ArticlesList.HasNext, ArticlesList.HasPrevious); var reslut = new { links, value = ArticlesAfterShaping }; //将page类转化为Json,并写入HTTP请求头中 Response.Headers.Add("Pagination", JsonConvert.SerializeObject(page, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() //将变量首字母改为小写 })); return(Ok(reslut)); }
//创建页面的links public IEnumerable <LinkViewModel> CreateHateoasLinksForPages(ArticlePrameters articlePrameters, bool hasNextPage, bool hasLastPage) { var links = new List <LinkViewModel>(); //添加selfLink links.Add(new LinkViewModel(CreateArticleUrl(articlePrameters, PaginationUrlType.CurrentPage), "self", "Get")); //判断是否有前一页/后一页 并加入links if (hasNextPage) { links.Add(new LinkViewModel(CreateArticleUrl(articlePrameters, PaginationUrlType.NextPage), "nextPage", "Get")); } if (hasLastPage) { links.Add(new LinkViewModel(CreateArticleUrl(articlePrameters, PaginationUrlType.PreviousPage), "lastPage", "Get")); } return(links); }
//查找所有的博客 public async Task <PaginatedList <Article> > GetAllArticleAsync(ArticlePrameters articlePrameters) { var result = MyDbContext.Articles.AsQueryable(); //执行过滤操作 if (!string.IsNullOrEmpty(articlePrameters.Title))//标题 { result = result.Where(x => x.Title.ToLowerInvariant() == articlePrameters.Title.ToLowerInvariant()); } if (!string.IsNullOrEmpty(articlePrameters.Auther))//作者 { result = result.Where(x => x.Auther.ToLowerInvariant() == articlePrameters.Auther.ToLowerInvariant()); } if (articlePrameters.AfterTime != null)//在某个时间之后 { result = result.Where(x => x.Date.CompareTo(articlePrameters.AfterTime) >= 0); } if (articlePrameters.BeforeTime != null)//在某个时间之前 { result = result.Where(x => x.Date.CompareTo(articlePrameters.BeforeTime) <= 0); } //执行模糊查询操作 if (!string.IsNullOrEmpty(articlePrameters.Contain))//标题包含 { result = result.Where(x => x.Title.ToLowerInvariant().Contains(articlePrameters.Contain.ToLowerInvariant())); } //根据排序选项排序 result = result.ApplySort(articlePrameters.OrderBy, PropertyMappingContainer.Resolve <ArticleViewModel, Article>()); //计算文章数量 var count = await result.CountAsync(); //执行分页操作 var data = await result.Skip(articlePrameters.PageSize *articlePrameters.PageIndex).Take(articlePrameters.PageSize).ToListAsync(); return(new PaginatedList <Article>(articlePrameters.PageSize, articlePrameters.PageIndex, count, data)); }