Razor页面无法同时使用Sort与Filter:排序会清除筛选状态
ASP.NET Core Razor页面筛选与排序状态丢失问题解决
问题描述
在ASP.NET Core Razor页面中使用筛选与排序功能时,先执行筛选再点击排序链接,筛选状态会被清除——核心原因是点击排序时未传递当前筛选参数,导致后端接收的筛选值为空,同时后端排序参数逻辑存在错误。
问题根源
- 前端排序链接仅传递
sortOrder参数,未携带当前筛选值CurrentFilter,后端OnGetAsync方法接收的searchString为空,筛选条件被重置。 - 后端
First_Name_Sort参数存在重复赋值,初始逻辑被覆盖,导致排序状态切换异常。 - 后端排序条件中的
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
相关产品推荐
相关产品推荐

