主要代码
[HtmlTargetElement("pagination")]
public class PagerTagHelper : TagHelper
{
// 总共有多少条记录
public long Total { get; set; } = 0;
// 一页有多少条记录
public int PerPage { get; set; } = 20;
// 当前第几页
public int Page { get; set; } = 1;
// 分页链接的最多显示个数
public int PageLength { get; set; } = 7;
private string url;
// 当前网址
public string Url
{
get { return url; }
set {
if (value.IndexOf('?') < 0)
{
url = value + "?page=";
return;
}
url = Regex.Replace(value, @"([\?\&])page=\d+\&*", "$1") + "&page=";
}
}
// 是否显示上一页下一页
public bool DirectionLinks { get; set; } = false;
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
var html = new StringBuilder();
var items = initLinks(out bool canPrevious, out bool canNext);
html.Append("<ul class=\"pagination\">");
if (DirectionLinks && canPrevious)
{
html.AppendFormat("<li class=\"page-item{0}\"><a class=\"page-link\" href=\"{1}{2}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span><span class=\"sr-only\">上一页</span></a></li>",
canPrevious ? "" : " disabled",
Url, Page - 1
);
}
foreach (var item in items)
{
if (item < 1)
{
html.Append("<li class=\"page-item disabled\"><a class=\"page-link\">...</a></li>");
continue;
}
html.AppendFormat("<li class=\"page-item{0}\"><a class=\"page-link\" href=\"{2}{3}\">{1}</a></li>",
item == Page ? " active" : "",
item,
Url, item
);
}
if (DirectionLinks && canNext)
{
html.AppendFormat("<li class=\"page-item{0}\"><a class=\"page-link\" href=\"{1}{2}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span><span class=\"sr-only\">下一页</span></a></li>",
canNext ? "" : " disabled",
Url, Page + 1
);
}
html.Append("</ul>");
output.Content.SetHtmlContent(html.ToString());
}
private List<int> initLinks(out bool canPrevious, out bool canNext)
{
var total = (int)Math.Ceiling((double)Total / PerPage);
canPrevious = Page > 1;
canNext = Page < total;
var items = new List<int>();
if (total < 2)
{
return items;
}
items.Add(1);
var lastList = (int)Math.Floor((double)PageLength / 2);
var i = Page - lastList;
var length = Page + lastList;
if (i < 2)
{
i = 2;
length = i + PageLength;
}
if (length > total - 1)
{
length = total - 1;
i = Math.Max(2, length - PageLength);
}
if (i > 2)
{
items.Add(0);
}
for (; i <= length; i++)
{
items.Add(i);
}
if (length < total - 1)
{
items.Add(0);
}
items.Add(total);
return items;
}
}
使用
这是控制器中的方法,需要传递当前网址到分页类中。
public IActionResult Index(int page = 1)
{
ViewData["items"] = _repository.GetPage(page);
ViewData["fullUrl"] = $"{HttpContext.Request.Path}{HttpContext.Request.QueryString}";
ViewData["pageIndex"] = page;
return View();
}
NetDream.Web
为当前项目命名空间
Page
为 NPoco
查询获取到的分页数据
@using NPoco;
@addTagHelper *, NetDream.Web
@{
var items = ViewData["items"] as Page<BlogModel>;
var pageIndex = (int)ViewData["pageIndex"];
}
<pagination url="@ViewData["fullUrl"]" total="@items.TotalItems" page="@pageIndex"></pagination>
转载请保留原文链接: https://zodream.cn/blog/id/197.html