自定义TageHelper并不难,只要记住几个点:

  1. 继承TagHelper
  2. 定义需要在TagHelper中传入的参数,如果不需要参数,可忽略
  3. 重写Process方法
  4. 在Process中拼接要输出的HTML字符串
  5. 在Views > _ViewImports.cshtml 中添加引用

仅此五步即可。

接下来实现分页。这里要做的是一个像bootstrap一样的简单分页

页面元素包括:首页链接 页码链接 尾页链接,也就是几个<a>标签,很简单,代码实现也就需要下面几步:

  1. 定义必要参数:记录总数 total,当前页码 pageIndex,每页显示的条数 pageSize,链接地址(不带分页参数)routeUrl
  2. 计算总页数 pageCount
  3. 拼接HTML字符串

当然,一个可用的连接必然还要考虑到两个基本功能:

  1. 跳转时保留查询参数
  2. 如果页数很多,全部显示必然会破坏页面结构,所以只能显示当前页码周围固定数量的页码,而隐藏其他的页码。

OK,下面是具体的代码实现:

using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Project.TagHelpers
{
public class MyPagerTagHelper : TagHelper
{
/// <summary>
/// 数据总数
/// </summary>
public int Total { get; set; } = 0; /// <summary>
/// 当前页码
/// </summary>
public int PageIndex { get; set; } = 1; /// <summary>
/// 每页记录数
/// </summary>
public int PageSize { get; set; } = 20; /// <summary>
/// 当前页路由
/// </summary>
public string RouteUrl { get; set; } /// <summary>
/// 当前页的查询条件
/// </summary>
public string Query { get; set; } private string SetQueryString()
{
var result = new List<string>();
if (!string.IsNullOrWhiteSpace(Query))
{
if (Query.StartsWith("?"))
{
Query = Query.Remove(0, 1);
} string[] paramList = Query.Split('&');
foreach (var param in paramList)
{
var paramName = param.Trim().ToLower();
if (!paramName.StartsWith("pageindex=") && !paramName.StartsWith("pagesize="))
{
result.Add(param);
}
}
// 用LINQ遍历
// result = paramList.Where(p => !p.ToLower().StartsWith("pageindex=") && !p.ToLower().StartsWith("pagesize=")).ToList();
}
result.Add("pageIndex={0}");
result.Add("pageSize=" + PageSize.ToString());
return "?" + string.Join('&', result);
} public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes.Add("class", "my-pager"); if (PageSize <= 0) { PageSize = 20; }
if (PageIndex <= 0) { PageIndex = 1; }
if (Total <= 0) { return; } //总页数
var totalPage = Total / PageSize + (Total % PageSize > 0 ? 1 : 0);
if (totalPage <= 0) { return; } Query = SetQueryString(); //构造分页样式
var sbPage = new StringBuilder(string.Empty); sbPage.Append("<ul class=\"pagination\">");
sbPage.AppendFormat("<li><a href=\"{0}{1}\">首页</a></li>",
RouteUrl,
string.Format(Query, 1)
); // 计算显示的页码
int start = 1;
int end = totalPage;
bool hasStart = false;
bool hasEnd = false; if (totalPage > 10)
{
if (PageIndex > 5)
{
start = PageIndex - 4;
hasStart = true;
} if (start + 9 < totalPage)
{
end = start + 9;
hasEnd = true;
}
else
{
end = totalPage;
start = totalPage - 9;
}
} if (hasStart)
{
sbPage.AppendFormat("<li><a href=\"{0}{1}\">...</a></li>",
RouteUrl,
string.Format(Query, start - 1)
);
} for (int i = start; i <= end; i++)
{
sbPage.AppendFormat("<li {1}><a href=\"{2}{3}\">{0}</a></li>",
i,
i == PageIndex ? "class=\"active\"" : "",
RouteUrl,
string.Format(Query, i)
);
} if (hasEnd)
{
sbPage.AppendFormat("<li><a href=\"{0}{1}\">...</a></li>",
RouteUrl,
string.Format(Query, end + 1)
);
} sbPage.Append("<li>");
sbPage.AppendFormat("<a href=\"{0}{1}\">",
RouteUrl,
string.Format(Query, totalPage));
sbPage.Append("尾页");
sbPage.Append("</a>");
sbPage.Append("</li>");
sbPage.Append("</ul>"); output.Content.SetHtmlContent(sbPage.ToString());
}
}
}  

话说,这不是一个令人满意的实现,特别是对查询字符串的处理上,不过此分页方案最终被放弃,也就没有继续深入,只提供思路,如有更好的实现方法,请留言告知,不胜感激。

接下来,在Views > _ViewImports.cshtml 中插入代码

@using Project.TagHelpers

@addTagHelper *, Project.TagHelpers

至此,自定义分页TageHelper完成,页面中调用方法如下:

<my-pager total="@Model.RecordCount"
page-index="@Model.PageIndex"
page-size="@Model.PageSize"
route-url="/Admin/WxAccount/Index"
query="@Url.ActionContext.HttpContext.Request.QueryString">
</my-pager>

@Model.xxx是我通过Controller传入的视图的数据,调用时请按实际情况替换即可。

结束,谢谢~

【aspnetcore】使用TagHelper制作分页组件的更多相关文章

  1. 转载使用Flurl制作可复用的分页组件

    使用Flurl制作可复用的分页组件 使用ASP.NET MVC查询时,一直使用MvcPaging组件,虽然需要自定义MvcPaging.Pager才能达到我想要的效果,但在没有较好的URL库时,还是这 ...

  2. ASP.NET:使用Flurl制作可复用的分页组件

    使用ASP.NET MVC查询时,一直使用MvcPaging组件,虽然需要自定义MvcPaging.Pager才能达到我想要的效果,但在没有较好的URL库时,还是这么用.分页的逻辑本来就不复杂,更重要 ...

  3. TagHelper+Layui封装组件之Radio单选框

    TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...

  4. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  5. angular-ui分页组件

    http://angular-ui.github.io/bootstrap/#/pagination 分页组件只提供生成分页按钮,数据的显示需要使用ng-repeat, 注意设置 items-per- ...

  6. asp.net mvc4+mysql做一个简单分页组件(部分视图)

    在开始做mysql分页功能组件前,便设定的是要有一定可复用性.先在项目里Views文件夹下右键新建名为_PaginationComponent.cshtml,这里html及css我采用的bootstr ...

  7. ReactJS实现的通用分页组件

    大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果 ...

  8. 基于vue2.0的分页组件开发

    今天安排的任务是写基于vue2.0的分页组件,好吧,我一开始是觉得超级简单的,但是越写越写不出来,写的最后乱七八糟的都不知道下句该写什么了,所以重新捋了思路,小结一下- 首先写组件需要考虑: 要从父组 ...

  9. 基于Vue封装分页组件

    使用Vue做双向绑定的时候,可能经常会用到分页功能 接下来我们来封装一个分页组件 先定义样式文件 pagination.css ul, li { margin: 0px; padding: 0px;} ...

随机推荐

  1. 人生苦短之Python函数的健壮性

    如何评论一个开发代码写的好?清晰简洁明了?No,No,一个处女座就可以写出来了,整齐地代码,详细的注释不是代码好的标准,应该说不是最重要的标准.代码写的是否健壮才是检验的重要标准. 代码的健壮性: 当 ...

  2. FFmpeg音视频编解码实践总结

    PS:由于目前开发RTSP服务器传输模块时用到了h264文件,所以攻了一段时间去实现h264的视频编解码,借用FFmpeg SDK实现了任意文件格式之间的转换,并实现了流媒体实时播放,目前音视频同步需 ...

  3. Kotlin静态方法

    Kotlin静态方法 工具类 全都是静态方法的情况 : class 类名 改为 object 类名 即可 package redwolf.com.moreimageupload import okht ...

  4. python学习笔记:第一天

    1.经典程序测试:hello world 入门编程语言第一件事,先写hello world. #!/usr/bin/env python# -*- coding: UTF-8 -*- print(&q ...

  5. yii中渲染模板时render与renderPartial的区别

    render方法在渲染模板时会将渲染布局文件,而renderPartial则不会渲染布局

  6. 使用MongoDB.NET 2.2.4驱动版本对 Mongodb3.3数据库中GridFS增删改查

    Program.cs代码如下: internal class Program { private static void Main(string[] args) { GridFSHelper help ...

  7. 第九章-IO编程

    IO是输出输入的意思 在计算机中常用到的数据交换的地方是磁盘, 网络等 输入流是从外面(磁盘, 网络)流进内存 输出流是从内存流到外面(磁盘, 网络) 同步IO是指等待IO完成再继续执行 异步IO是在 ...

  8. ubuntu 下编译安装ceph

    git clone --recursive https://github.com/ceph/ceph.git  cd ceph/  sudo apt-get install libtool   sud ...

  9. 「SDFZ听课笔记」二分图&&网络流

    二分图? 不存在奇环(长度为奇数的环)的图 节点能黑白染色,使得不存在同色图相连的图 这两个定义是等价哒. 直观而言,就是这样的图: 二分图有一些神奇的性质,让一些在一般图上复杂度飞天的问题可以在正常 ...

  10. 自适应文案提示框、无数据图片加载<IOS小组件>

    非常感谢,帮助我的朋友们,谢谢你们. 该组件的编写仅仅用来不到4个小时,包括测试与修改bug.为他起名为AdaptivePromptDialogBox(就是自适应文案提示框): 呆毛地址:链接 < ...