分页查询点击上一页返回数据异常 Skip参数错误排查
问题根因
问题出在分页参数skip的计算逻辑错误,你之前判断问题不在AngularJS层面的结论是错的,后端查询逻辑本身没有问题。
分页场景下skip(跳过条数)的正确计算公式为:
skip = (目标页码 - 1) * 单页数据量(take)
你可以对照自己的参数验证:
- 初始加载第一页:
pageNumber=1,按公式算skip=(1-1)*5=0,和你传的参数一致,跳过0条取5条,返回A-E,结果正常 - 点Next到第二页:
pageNumber=2,按公式算skip=(2-1)*5=5,和你传的参数一致,跳过前5条取5条,返回F-I,结果正常 - 点Prev回第一页:你实际传的
skip=4,完全不符合公式计算的正确值0。此时后端按逻辑跳过前4条(AA、BB、CC、DD),取后续5条数据,正好是EE、FF、GG、HH、II,也就是你看到的E-I结果,和后端执行逻辑完全匹配。
错误触发原因
你的分页控件在Prev按钮的点击逻辑里,用了错误的偏移计算规则:大概率是直接拿当前页第一条数据的索引做减1操作算skip——第二页第一条数据的索引是5,错误做5-1=4的计算,就得到了错误的skip=4参数。
修复方案
1. 前端参数计算逻辑修正
不要单独维护skip变量,所有分页跳转(上一页、下一页、点击指定页码)触发时,统一用目标页码和单页量计算skip,不要在按钮事件里手动对skip做加减:
// 分页跳转统一入口 function onPageChange(targetPage) { const pageSize = 5; const skip = (targetPage - 1) * pageSize; // 调用接口传参 GetCategories(targetPage, skip, pageSize); }
2. 后端增加兜底校验(可选,推荐)
后端不要完全信任前端传入的skip值,直接根据传入的pageNumber和take计算正确的偏移量,从根源避免前端传参错误导致的返回数据异常:
public PagedCategory GetCategories(int pageNumber, int skip = 0, int take = 0) { var pc= new PagedCategory(); if (take > 0) { // 后端兜底计算正确偏移,忽略前端传入的错误skip int validSkip = (pageNumber - 1) * take; var q = ctx.GetSortedData();// 已按PriorityOrder排序 pc.Categories = q.Skip(validSkip).Take(take).ToList(); pc.TotalItems = q.Count(); pc.CurrentPage = pageNumber; var tp = Math.Ceiling((double)pc.TotalItems / take); pc.TotalPages = Convert.ToInt32(tp); } return pc; }
内容的提问来源于stack exchange,提问作者Computer
相关产品推荐
相关产品推荐

