筛选/排序后如何让PagedList分页不重置为第1页并停留在当前页
问题原因
你遇到的分页重置问题有两个核心诱因:
- 筛选/排序提交的表单没有携带当前页码参数,控制器接收的
page值为null,触发默认赋值为1的逻辑 - 控制器
GetTableData方法中存在searchString不为空就强制重置页码为1的代码,和需求冲突
修改方案
1. 视图层调整
在筛选表单内新增隐藏域,用于传递当前页码,确保提交排序/筛选请求时可以保留当前页号:
@using (Html.BeginForm("GetTableData", "ProductSearchBlock", FormMethod.Get)) { <!-- 新增隐藏域传递当前页码 --> <input type="hidden" name="page" value="@Model.PageNumber" /> <!-- 原有表单内容保持不变 --> <span>Order By</span> <select id="orderBySelect" name="orderBy" aria-hidden="true"> @*原有下拉选项逻辑*@ </select> @*其余表单元素代码省略*@ }
2. 控制器层调整
根据你的需求修改GetTableData的页码处理逻辑:
若需求为「排序、筛选操作都保留当前页码」,直接删除强制重置页码的代码即可:
public ActionResult GetTableData(string searchString, string orderBy, int? page) { if (searchString == null && orderBy == null) { return Redirect(PageHelper.CurrentPageUrl()); } // 删除下面这段强制重置页码的逻辑 // if (searchString != null) // { // page = 1; // } int pageNumber = page ?? 1; var orderByQuery = UriUtil.AddQueryString(PageHelper.CurrentPageUrl(), RequestQueryConstants.OrderBy, orderBy.ToString()); var SearchStringQuery = UriUtil.AddQueryString(orderByQuery, RequestQueryConstants.SearchString, searchString); var finalUrl = UriUtil.AddQueryString(SearchStringQuery, RequestQueryConstants.PageNumber, pageNumber.ToString()); return Redirect(finalUrl); }
若需求为「仅排序保留页码,搜索关键词变更时仍跳转到第1页」,可以新增关键词变更判断逻辑:
你可以在表单中再加一个隐藏域存原有搜索词,提交到控制器后对比,如果搜索词发生变化再重置页码,否则保留当前页码即可。
可选兜底优化
如果筛选后总页数小于当前页码,会出现空页问题,可以在Index方法中加一层页码合法性校验:
// 调用ToPagedList之前添加校验逻辑 int pageSize = 2; int totalCount = productsResult.Count; int maxPage = (int)Math.Ceiling(totalCount / (double)pageSize); int parsedPage = int.Parse(pageNumber); // 页码超过总页数时自动跳转到最后一页 if (parsedPage > maxPage && maxPage > 0) { parsedPage = maxPage; } viewModel.Products = productsResult.ToPagedList(parsedPage, pageSize);
内容的提问来源于stack exchange,提问作者Aniki
相关产品推荐
相关产品推荐

