[Asp.Net Core] - 使用 ViewComponents 实现分页控件
分页控件(定义分页参数)
~/ViewComponents/PaginationViewComponent.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using HelloWorld.DataContext; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace HelloWorld.ViewComponents { public class PaginationViewComponent : ViewComponent { protected readonly IHostingEnvironment Env; protected readonly AppBusinessDbContext BusinessDbContext; protected readonly ILogger Logger; public PaginationViewComponent(IHostingEnvironment env, AppBusinessDbContext context, ILoggerFactory loggerFactory) { Env = env; BusinessDbContext = context; Logger = loggerFactory.CreateLogger<PaginationViewComponent>(); } public IViewComponentResult Invoke() { return View(); } } } |
~/Views/Shared/Components/Pagination/Default.cshtml
<nav> <ul class="pagination"> @{ const int pageIncrement = 2; const int pageTrailing = 5; var totalPageCount = ViewBag.TotalPageCount == null ? 1 : (int)ViewBag.TotalPageCount; if (totalPageCount > 1) { var pageIndex = ViewBag.CurrentPageIndex == null ? 1 : (int)ViewBag.CurrentPageIndex; var pageRangeStart = pageIndex <= pageIncrement ? 1 : pageIndex - pageIncrement; var pageRangeEnd = pageIndex + pageIncrement <= totalPageCount ? (totalPageCount > pageTrailing && pageIndex + pageIncrement < pageTrailing ? pageTrailing : pageIndex + pageIncrement) : totalPageCount; if (pageRangeStart > 1) { <li class="page-item"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="1" /> </li> if (pageRangeStart > 2) { <li class="page-item disabled"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="..." /> </li> } } for (var i = pageRangeStart; i <= pageRangeEnd; i++) { <li class="page-item @(pageIndex == i ? "active" : null)"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="@i" /> </li> } if (pageRangeEnd < totalPageCount) { if (pageRangeEnd + 1 < totalPageCount) { <li class="page-item disabled"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="..." /> </li> } <li class="page-item"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="@totalPageCount" /> </li> } } } </ul> </nav>
列表页面(更新分页参数)
~/Controllers/ArticleController.cs
public async Task<IActionResult> List(int id, string keyword)
{
ViewBag.KeyWord = keyword;
ViewBag.CurrentPageIndex = id <= 1 ? 1 : id;
ViewBag.TotalPageCount = 1;
if (!ModelState.IsValid) return View();
List<ResumeDetail> list;
if (string.IsNullOrEmpty(keyword))
{
list = await _businessDbContext.News.Join(_businessDbContext.Mapping, r => r.Gid, m => m.Gid, (r, m) => new { r, m })
.Where(t => t.r.Active && t.m.UserGid == UserGid).OrderByDescending(t => t.r.Created).Select(t => t.r).ToListAsync();
}
else
{
keyword = keyword.ToLower().Trim();
list = await _businessDbContext.News.Join(_businessDbContext.Mapping, r => r.Gid, m => m.Gid, (r, m) => new { r, m })
.Where(t => t.r.Active && t.m.UserGid == UserGid && !string.IsNullOrEmpty(t.r.Title) && t.r.Title.ToLower().Contains(keyword))
.OrderByDescending(t => t.r.Created)
.Select(t => t.r).ToListAsync();
}
var tmpTotalCount = list.Count;
ViewBag.TotalPageCount = (tmpTotalCount / PageSize) + (tmpTotalCount % PageSize == 0 ? 0 : 1);
var result = list.Skip(PageSize * (id - 1)).Take(PageSize).Select(ResumeBasicViewModel.ConvertToViewModel).ToList();
return View(result);
}
~/Views/Article/List.cshtml
<nav class="navbar navbar-light bg-faded"> <form asp-controller="Candidate" asp-action="List" method="GET"> <div class="row"> <div class="col-6"> @await Component.InvokeAsync("Pagination") </div> <div class="col-4"> <input type="text" name="keyword" class="form-control" maxlength="50" placeholder="关键字" value="@ViewBag.KeyWord"/> </div> <div class="col-1" style="padding-left: 0;"> <button class="form-control btn btn-success" type="submit">检 索</button> </div> <div class="col-1" style="padding-left: 0;"> <button class="form-control btn btn-secondary" type="submit" onclick="fnClearKeyword()">清 空</button> </div> </div> </form> </nav>
分页效果
参考资料
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】