ASP.NET Core分页场景下筛选状态丢失问题求助
看起来你遇到了分页和筛选联动的经典问题——筛选条件在页码切换时丢失,而且在非第一页筛选会跳回首页。我来帮你一步步解决这个问题:
问题根源
核心问题有三个:
- 分页组件生成的链接没有携带当前的筛选参数(
SelectedStatus),导致切换页码时控制器收不到筛选条件,自动重置为默认状态; - 表单提交筛选时,没有传递当前页码,控制器默认从第一页加载数据;
- 你的ViewModel里
SelectedStatus是普通枚举类型,默认会取枚举的第一个值,导致初始加载时的筛选逻辑不符合预期。
解决方案步骤
1. 修正ViewModel的筛选字段类型
首先把SelectedStatus改成可空枚举,避免默认值干扰“无筛选”的逻辑:
public class EsaViewModel { // 保留你原有的其他字段... public Status? SelectedStatus { get; set; } // 改为可空枚举 public PagingList<Esa> Esas { get; set; } }
2. 优化控制器的筛选逻辑
修正控制器里的查询逻辑,适配可空枚举的判断,同时简化代码:
public async Task<IActionResult> Index(EsaViewModel viewModel, int page = 1) { int pageSize = 8; IQueryable<Esa> query = _context.Esas.AsNoTracking(); // 管理员/PMO用户的筛选逻辑 if (User.IsInRole("Admin") || User.IsInRole("PMOUser")) { // 如果有筛选条件,过滤对应状态 if (viewModel.SelectedStatus.HasValue) { query = query.Where(s => s.Status == viewModel.SelectedStatus.ToString()); } // 无筛选时按Status降序排列 query = query.OrderByDescending(s => s.Status); } else { // 非管理员用户默认按项目ID排序 query = query.OrderBy(s => s.EsaProjectId); } // 生成分页列表并返回视图 viewModel.Esas = await PagingList.CreateAsync(query, pageSize, page); return View(viewModel); }
3. 让分页组件携带筛选参数
修改页面中的分页Tag Helper,让它生成的页码链接带上当前的SelectedStatus参数:
<vc:pager paging-list="@Model" asp-route-selectedStatus="@Model.SelectedStatus" />
这样当你点击第二页时,筛选条件会被自动传递到控制器,分页后筛选状态不会丢失。
4. 修复筛选表单的页码传递(可选)
如果你希望在第二页点击筛选时,停留在筛选结果的对应页码(而不是强制回到第一页),可以在表单里添加一个隐藏字段保存当前页码:
<form asp-controller="Esa" asp-action="Index" method="post"> <div> @Html.Label("Filter By:") <!-- 修正下拉列表,添加"All"默认选项对应无筛选 --> @Html.DropDownListFor(model => model.SelectedStatus, new SelectList(Enum.GetValues(typeof(Status)).Cast<Status>(), "ToString", "ToString"), "All", new { @class = "form-control" }) <!-- 添加隐藏字段传递当前页码 --> <input type="hidden" name="page" value="@Model.Esas.PageIndex" /> <input type="submit" value="Enter" /> </div> <!-- 表格和分页组件保持不变 --> </form>
这个修改会让筛选提交时带上当前页码,控制器会加载筛选结果的对应页(如果筛选后的数据集有足够页数)。
现在测试一下:
- 选择筛选条件提交,会显示筛选后的第一页数据;
- 点击第二页,分页链接会携带筛选参数,控制器会继续筛选并显示第二页;
- 如果在第二页再次筛选,会跳转到筛选结果的对应页码(如果存在)。
这样就能完美解决你的筛选状态丢失和分页跳转重置的问题了。
内容的提问来源于stack exchange,提问作者Aakib
相关产品推荐
相关产品推荐

