You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core分页场景下筛选状态丢失问题求助

看起来你遇到了分页和筛选联动的经典问题——筛选条件在页码切换时丢失,而且在非第一页筛选会跳回首页。我来帮你一步步解决这个问题:

问题根源

核心问题有三个:

  1. 分页组件生成的链接没有携带当前的筛选参数(SelectedStatus),导致切换页码时控制器收不到筛选条件,自动重置为默认状态;
  2. 表单提交筛选时,没有传递当前页码,控制器默认从第一页加载数据;
  3. 你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:42:46