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

Razor页面无法同时使用Sort与Filter:排序会清除筛选状态

ASP.NET Core Razor页面筛选与排序状态丢失问题解决

问题描述

在ASP.NET Core Razor页面中使用筛选与排序功能时,先执行筛选再点击排序链接,筛选状态会被清除——核心原因是点击排序时未传递当前筛选参数,导致后端接收的筛选值为空,同时后端排序参数逻辑存在错误。

问题根源

  1. 前端排序链接仅传递sortOrder参数,未携带当前筛选值CurrentFilter,后端OnGetAsync方法接收的searchString为空,筛选条件被重置。
  2. 后端First_Name_Sort参数存在重复赋值,初始逻辑被覆盖,导致排序状态切换异常。
  3. 后端排序条件中的Course_Date_Asc与前端生成的Course_Date_asc大小写不一致,可能导致排序不生效。

解决方案

1. 修复后端PageModel逻辑

修正排序参数赋值错误

将原重复赋值的First_Name_Sort代码替换为:

// 处理FirstName的排序切换逻辑
if (string.IsNullOrEmpty(sortOrder))
{
    First_Name_Sort = "First_Name_desc";
}
else
{
    First_Name_Sort = sortOrder == "First_Name_asc" ? "First_Name_desc" : "First_Name_asc";
}

统一排序条件大小写

将后端switch中的Course_Date_Asc改为小写的Course_Date_asc,与前端生成的参数一致:

case "Course_Date_asc":
    CourseTakenList_Temp = CourseTakenList_Temp.OrderBy(s => s.Course_Date);
    break;

优化参数绑定逻辑

利用已标记[BindProperty(SupportsGet = true)]的SearchString,简化OnGetAsync方法参数,直接使用模型属性:

public async Task OnGetAsync(string sortOrder)
{   
    IQueryable<CourseTaken_Model> CourseTakenList_Temp = from s in _context.CourseTaken_DbSet
                    where !string.IsNullOrEmpty(s.First_Name)
                    select s;

    CurrentSort = sortOrder;
    CurrentFilter = SearchString; // 直接绑定请求中的SearchString

    if (!string.IsNullOrEmpty(SearchString))
    {
        CourseTakenList_Temp = CourseTakenList_Temp.Where(s => s.First_Name.ToUpper().Contains(SearchString.ToUpper())
                        || s.Last_Name.ToUpper().Contains(SearchString.ToUpper()));
    }

    // 其余排序参数处理及switch逻辑保持不变...
}

2. 修改前端排序链接,传递筛选参数

在每个排序链接中添加asp-route-searchString="@Model.CurrentFilter",确保点击排序时携带当前筛选值:

<a asp-page="./My_Training" asp-route-sortOrder="@Model.First_Name_Sort" asp-route-searchString="@Model.CurrentFilter">
    @Html.DisplayNameFor(model => model.CourseTakenList[0].First_Name)
</a>
...
<a asp-page="./My_Training" asp-route-sortOrder="@Model.Last_Name_Sort" asp-route-searchString="@Model.CurrentFilter">
    @Html.DisplayNameFor(model => model.CourseTakenList[0].Last_Name)
</a>
<a asp-page="./My_Training" asp-route-sortOrder="@Model.Course_Date_Sort" asp-route-searchString="@Model.CurrentFilter">
    @Html.DisplayNameFor(model => model.CourseTakenList[0].Course_Date)
</a>

效果验证

修改完成后,先输入筛选条件点击筛选,再点击任意排序链接,页面将保持筛选状态并执行对应排序,不会出现筛选状态丢失的问题。

内容的提问来源于stack exchange,提问作者dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:00:55