【发布时间】:2022-01-12 17:27:19
【问题描述】:
有一个问题困扰了我 2 天。想不通,所以也许另一双或几双新鲜的眼睛可以为我指明正确的方向。
我有一个用于 CRUD 操作的存储库
public async Task<int> GetCount()
{
var data = await GetData();
return data.Count;
}
public async Task<List<Item>> GetPaginatedResult(int currentPage, int pageSize = 20)
{
var data = await GetData();
return data.OrderBy(d => d.Day).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList();
}
public async Task<List<Item>> GetData()
{
return await _db.Set<Item>().ToListAsync();
}
Item 是一个简单的模型类,我这里没有问题。 在我尝试将分页与过滤结合起来之前,分页效果很好。
我有一个下拉菜单提供年份编号(2022、2021),另一个提供月份(整数值)。
这是导致问题的部分代码:
var tempData = await repository!.GetPaginatedResult(CurrentPage, PageSize);
Items = tempData;
//Items = tempData.Where(s => s.Year == SearchYear && s.Month == Month);
var sumList = await repository!.GetData();
//Count = sumList.Where(s => s.Year == SearchYear && s.Month == Month).OrderBy(x => x.Day).Count();
Count = sumList.OrderBy(x => x.Day).Count();
//SumValues = sumList.Where(s => s.Year == SearchYear && s.Month == Month).OrderBy(x => x.Day).Sum(s => s.Value);
SumValues = sumList.Sum(s => s.Value);
这种分页方式在应用过滤之前起作用。
当我改用这条线时:
Items = tempData.Where(s => s.Year == SearchYear && s.Month == Month);
没有错误但奇怪的行为。当使用注释行而不是当前行时,例如,我在第一页上只显示 9 条记录而不是 20 条什么是 PageSize,也是在第一次单击 Next 分页按钮后,例如 Items 列表为空。
SumValues,只是显示过滤记录总和的文本工作正常,其他一切都是一团糟。
视图是填充表格的经典:
<tbody>
@foreach(var obj in Model.Items!)
{
<tr>
<td>@obj.Day</td>
<td>@obj.Month</td>
<td>@obj.Year</td>
<td>@obj.ItemName</td>
<td>@obj.Destination</td>
<td class = "text-end">@string.Format("{0:#,#}", obj.Quantity)</td>
<td class = "text-end">@string.Format("{0:#,#.00}", obj.Value)</td>
<td class = "text-center">Edit Delete</td>
</tr>
}
</tbody>
更新: 我按照建议将操作顺序更改为:
var tempData = await repository!.GetData();
var filteredData = tempData.Where(s => s.Year == SearchYear && s.Month == Month);
Items = await repository!.GetPaginatedResult(filteredData, CurrentPage, PageSize);
Count = filteredData.Count();
SumValues = filteredData.Sum(s => s.Value);
现在,当我在搜索组合框中更改选定的年份和月份时,它显示正常,有 20 条记录。但是当我单击第二页的下一步按钮时出现问题,表格为空。根据 Visual Studio 中的调试信息 tempData 有它应该的记录数,但过滤数据变为空。不知道为什么。 :/
悬停时下一个按钮的链接上的字符串显示 .../Year=2021&Month=12&CurrentPage=2 应该这样
我将存储库中的方法更改为:
public Task<List<Item>> GetPaginatedResult(IEnumerable<Item> tempList, int currentPage, int pageSize = 20)
{
return Task.FromResult(tempList.OrderBy(d => d.Day).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList());
}
关于页面链接的代码:
<ul class="pagination">
@if (Model.ShowPrevious)
{
<li class="page-item text-center">
<a asp-page="/Poetracker/Index"
asp-route-SearchTerm = "@Model.SearchYear"
asp-route-Month = "@Model.Month"
asp-route-CurrentPage="@(Model.CurrentPage - 1)"
class="btn btn-outline-primary btn-sm" style = "width:100px"><i class="fas fa-backward"></i> Previous</a>
</li>
}
@if (Model.ShowNext)
{
<li class="page-item text-center">
<a asp-page="/Poetracker/Index"
asp-route-SearchTerm = "@Model.SearchYear"
asp-route-Month = "@Model.Month"
asp-route-CurrentPage="@(Model.CurrentPage + 1)"
class="btn btn-outline-primary btn-sm" style = "width:100px"><i class="fas fa-forward"></i> Next</a>
</li>
}
</ul>
最终编辑:当我将属性名称从 SearchTerm 更改为 SearchYear 时,忘记相应地更新 asp-route。现在按预期工作。
【问题讨论】:
标签: c# .net razor pagination filtering