zoukankan      html  css  js  c++  java
  • .Net Core MVC 基于Layui Taghelper 自定义分页

    防真伪链接:https://www.cnblogs.com/wen593692967

    分页在项目中是必不可少的,最近前端使用Layui框架,看了下Layui官网分页的案例,发现都是异步Ajax分页的方式,想要返回Model分页,看来需要自己动手了,自力更生丰衣足食。

    得,话不多说,开始撸码。

     接口:

    IPageList

    /// <summary>
        /// 分页接口
        /// </summary>
        public interface IPageList<T> : IList<T>
        {
            /// <summary>
            /// 当前页
            /// </summary>
            int PageIndex { get; set; }
    
            /// <summary>
            /// 页码
            /// </summary>
            int PageSize { get; set; }
    
            /// <summary>
            /// 总数据量
            /// </summary>
            int ItemCount { get; set; }
    
            /// <summary>
            /// 总页数
            /// </summary>
            int PageCount { get; }
    
            /// <summary>
            /// 是否有上一页
            /// </summary>
            bool HasPreViousPage { get; }
    
            /// <summary>
            /// 是否有下一页
            /// </summary>
            bool HasNextPage { get; }
        }
    

    分页接口实现:

    PageList:

     /// <summary>
        /// 分页接口实现
        /// </summary>
        public class PageList<T> : List<T>, IPageList<T>
        {
            public PageList()
            {
    
            }
    
            /// <summary>
            /// IQueryable 分页
            /// </summary>
            /// <param name="sourceItem">数据</param>
            /// <param name="pageIndex">当前页</param>
            /// <param name="pageSize">页码</param>
            public PageList(IQueryable<T> sourceItem, int pageIndex, int pageSize)
            {
                PageIndex = pageIndex < 1 ? 1 : pageIndex;
                PageSize = pageSize < 10 ? 10 : pageSize;
    
                ItemCount = sourceItem.Count();
    
                this.AddRange(sourceItem.Skip((pageIndex - 1) * pageSize).Take(pageSize));
            }
    
            /// <summary>
            /// List 分页
            /// </summary>
            /// <param name="item">数据</param>
            /// <param name="pageIndex">当前页</param>
            /// <param name="pageSize">页码</param>
    
            public PageList(List<T> item, int pageIndex, int pageSize)
            {
                PageIndex = pageIndex < 1 ? 1 : pageIndex;
                PageSize = pageSize < 10 ? 10 : pageSize;
    
                ItemCount = item.Count;
    
                this.AddRange(item.Skip((pageIndex - 1) * pageSize).Take(pageSize));
            }
    
    
            /// <summary>
            /// 当前页
            /// </summary>
            public int PageIndex { get; set; }
    
            /// <summary>
            /// 页码
            /// </summary>
            public int PageSize { get; set; }
    
            /// <summary>
            /// 总数据量
            /// </summary>
            public int ItemCount { get; set; }
    
            /// <summary>
            /// 总页码
            /// </summary>
            public int PageCount
            {
                get
                {
                    return ItemCount % PageSize == 0 ? (ItemCount / PageSize) : (ItemCount / PageSize + 1);
                }
            }
    
            /// <summary>
            /// 是否有上一页
            /// </summary>
            public bool HasPreViousPage => PageIndex > 1;
    
            /// <summary>
            /// 是否有下一页
            /// </summary>
            public bool HasNextPage => PageIndex < PageCount;
    
        }
    

      控制器:

      Controller:

      

    Taghelper:

    /// <summary>
        /// 分页控件
        /// </summary>
        [HtmlTargetElement("pager", TagStructure = TagStructure.WithoutEndTag)]
        public class PagerTagHelper : TagHelper
        {
            private IUrlHelper urlHelper;
            public PagerTagHelper(IUrlHelper _urlHelper)
            {
                urlHelper = _urlHelper;
            }
    
            /// <summary>
            /// Action
            /// </summary>
            [HtmlAttributeName("asp-action")]
            public string Action { get; set; }
    
            /// <summary>
            /// Controller
            /// </summary>
            [HtmlAttributeName("asp-controller")]
            public string Controller { get; set; }
    
            /// <summary>
            /// 分页对象
            /// </summary>
            [HtmlAttributeName("page-model")]
            public dynamic PageModel { get; set; }
    
            /// <summary>
            /// 生成分页控件
            /// </summary>
            /// <param name="context"></param>
            /// <param name="output"></param>
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                //如果没有记录则不显示分页
                if (PageModel.ItemCount <= 1)
                {
                    base.Process(context, output);
              return; } //between int start = PageModel.PageIndex - 5; start = start < 1 ? 1 : start; //end int end = start + 9; end = end > PageModel.PageCount ? PageModel.PageCount : end; output.TagName = "div"; output.Attributes.SetAttribute("class", "layui-table-page"); output.Content.AppendHtmlLine($"<div class="layui-table-page1">"); //拼接分页的Html output.Content.AppendHtmlLine($"<div class="layui-box layui-laypage layui-laypage-default">"); //总记录数 output.Content.AppendHtmlLine($"<span class="layui-laypage-count">共{PageModel.ItemCount}条,共{PageModel.PageCount}页</span>"); //上一页按钮 if (PageModel.HasPreViousPage) { output.Content.AppendHtmlLine($"<a href="{urlHelper.Action(action: Action, controller: Controller, new { page = PageModel.PageIndex - 1 })}" class="layui-laypage-prev" data-page="{PageModel.PageIndex - 1}"><i class="layui-icon layui-icon-left"></i></a>"); } else { output.Content.AppendHtmlLine($"<a href="javascipts:;" class="layui-laypage-prev layui-disabled" data-page="{PageModel.PageIndex - 1}"><i class="layui-icon layui-icon-left"></i></a>"); } //按钮有序数量 for (int i = start; i <= end; i++) { //激活当前页 if (i == PageModel.PageIndex) { output.Content.AppendHtmlLine("<span class="layui-laypage-curr">"); output.Content.AppendHtmlLine("<em class="layui-laypage-em"></em>"); output.Content.AppendHtmlLine($"<em>{i}</em>"); output.Content.AppendHtmlLine("</span>"); } else { output.Content.AppendHtmlLine($"<a href="{urlHelper.Action(action: Action, controller: Controller, new { page = i })}" data-page="{i}">{i}</a>"); } } //是否有下一页按钮 if (PageModel.HasNextPage) { output.Content.AppendHtmlLine($"<a href="{urlHelper.Action(action: Action, controller: Controller, new { page = PageModel.PageIndex + 1 })}" class="layui-laypage-prev" data-page="{PageModel.PageIndex + 1}"><i class="layui-icon layui-icon-right"></i></a>"); } else { output.Content.AppendHtmlLine($"<a href="javascipts:;" class="layui-laypage-prev layui-disabled" data-page="{PageModel.PageIndex + 1}"><i class="layui-icon layui-icon-right"></i></a>"); } output.Content.AppendHtmlLine($"</div>"); output.Content.AppendHtmlLine($"</div>"); output.TagMode = TagMode.StartTagAndEndTag; } }

      View页面调用:

     最终渲染成Html的样子:

  • 相关阅读:
    对linux内核创建flash上的各分区源码进行分析
    如何调试ubifs文件系统
    如何打开linux内核中dev_dbg的开关
    配置linux内核输出所有的log信息
    uboot向linux传递输出任何log信息的方法
    redis:Invalid input of type: 'bool' type. Convert to a byte,string or number first
    dd命令参数解析
    shell脚本中使用什么工具进行计算
    openwrt的编译方法
    bootstraptable表格columns 隐藏方法
  • 原文地址:https://www.cnblogs.com/wen593692967/p/12912105.html
Copyright © 2011-2022 走看看