NET Core中怎么利用TagHelper实现分页标签
创始人
2024-11-28 10:21:49
0次

1.继承父类TagHelper并重写Process方法(这里还有一个异步的方法ProcessAsync各位可以自己尝试下)

首先咋们定义一个类取名为PagerTagHelper,这里需要继承TagHelper类,重写Process方法,TagHelper位于命名空间Microsoft.AspNetCore.Razor.TagHelpers下面,因为这里要实现的效果是mvc分页,所以还需要通过nuget获取引用Microsoft.AspNetCore.Mvc.TagHelpers,引用后如图:

NET Core中怎么利用TagHelper实现分页标签

这里的版本是1.0.0-rc2-final,之前直接通过nuget引用默认版本是1.0.0版本如图本地已经下载了两个版本:

NET Core中怎么利用TagHelper实现分页标签

各位需要注意版本一直,不然还原程序包的时候会出错

2.注意:怎么在试图页面使用自定义标签

如果要在html中使用定义的标签,需要注意命名规则如图上面定义的类:

NET Core中怎么利用TagHelper实现分页标签

标签类必须以TagHelper结尾,然后在试图中使用如图所示:

NET Core中怎么利用TagHelper实现分页标签

这里的pager就是上面PagerTagHelper对应的标签,去掉固定的TagHelper然后剩余Pager,因为html标签都是小写所以是pager,咋们先在Process中打个断点然后F5调试,可以看到进入了咋们重写的方法中,这样pager标签就和标签类对应上了

3.注意:怎么识别标签中的属性

咋们在自定义标签类中定义个属性(这里因为要做分页所以这里直接定义个分页参数的对应属性类当做标签类的属性),分页参数类如下:

/// 
 /// 分页option属性
 /// 
 public class MoPagerOption
 {
  /// 
  /// 当前页 必传
  /// 
  public int CurrentPage { get; set; }
  /// 
  /// 总条数 必传
  /// 
  public int Total { get; set; }

  /// 
  /// 分页记录数(每页条数 默认每页15条)
  /// 
  public int PageSize { get; set; }

  /// 
  /// 路由地址(格式如:/Controller/Action) 默认自动获取
  /// 
  public string RouteUrl { get; set; }

  /// 
  /// 样式 默认 bootstrap样式 1
  /// 
  public int StyleNum { get; set; }
 }

然后定义的属性PagerOption截图如:

NET Core中怎么利用TagHelper实现分页标签

这里要让定义的属性在标签中能使用需要注意在html中小写,然后首个单词后面以'-'和后面的单词隔开,下面是试图标签中使用定义的属性:

NET Core中怎么利用TagHelper实现分页标签

注意:

*单词大小写

*首个单词后'-'分割(属性名称是PagerOption对应pager-option这个细节不容忽视)

4.注意:自定义标签类怎么获取分页参数

这里用到上面第3点的属性节点来传递参数,先看一下咋们在Controller定义的列表数据和分页数据封装如下:

// GET: Articles
  public async Task Index(int id = 1)
  {

   var artiles = _context.Article;
   var pageOption = new MoPagerOption
   {
    CurrentPage = id,
    PageSize = 2,
    Total = await artiles.CountAsync(),
    RouteUrl = "/Articles/Index"
   };

   //分页参数
   ViewBag.PagerOption = pageOption;

   //数据
   return View(await artiles.OrderByDescending(b => b.CreateTime).Skip((pageOption.CurrentPage - 1) * pageOption.PageSize).Take(pageOption.PageSize).ToListAsync());
  }

然后在试图对应的自定义分页标签属性中:

复制代码 代码如下:

1

就是这么简单,通过标签属性直接传递到标签类中的属性上,需要更详细跟中的朋友可以F5调试下看看结果,以上就是这次分享的注意点,需要注意这几个output.TagName = "div"这个是定义一个包含了重新元素的父级元素,output.TagMode是标签在html中表现形式,再来就是自定义标签类的全部代码:

using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Text.Core.Extend
{

 #region 分页扩展 PageExtend

 /// 
 /// 分页option属性
 /// 
 public class MoPagerOption
 {
  /// 
  /// 当前页 必传
  /// 
  public int CurrentPage { get; set; }
  /// 
  /// 总条数 必传
  /// 
  public int Total { get; set; }

  /// 
  /// 分页记录数(每页条数 默认每页15条)
  /// 
  public int PageSize { get; set; }

  /// 
  /// 路由地址(格式如:/Controller/Action) 默认自动获取
  /// 
  public string RouteUrl { get; set; }

  /// 
  /// 样式 默认 bootstrap样式 1
  /// 
  public int StyleNum { get; set; }
 }

 /// 
 /// 分页标签
 /// 
 public class PagerTagHelper : TagHelper
 {

  public MoPagerOption PagerOption { get; set; }

  
  public override void Process(TagHelperContext context, TagHelperOutput output)
  {

   output.TagName = "div";

   if (PagerOption.PageSize <= 0) { PagerOption.PageSize = 15; }
   if (PagerOption.CurrentPage <= 0) { PagerOption.CurrentPage = 1; }
   if (PagerOption.Total <= 0) { return; }

   //总页数
   var totalPage = PagerOption.Total / PagerOption.PageSize + (PagerOption.Total % PagerOption.PageSize > 0 ? 1 : 0);
   if (totalPage <= 0) { return; }
   //当前路由地址
   if (string.IsNullOrEmpty(PagerOption.RouteUrl))
   {

    //PagerOption.RouteUrl = helper.ViewContext.HttpContext.Request.RawUrl;
    if (!string.IsNullOrEmpty(PagerOption.RouteUrl))
    {

     var lastIndex = PagerOption.RouteUrl.LastIndexOf("/");
     PagerOption.RouteUrl = PagerOption.RouteUrl.Substring(0, lastIndex);
    }
   }
   PagerOption.RouteUrl = PagerOption.RouteUrl.TrimEnd('/');

   //构造分页样式
   var sbPage = new StringBuilder(string.Empty);
   switch (PagerOption.StyleNum)
   {
    case 2:
     {
      break;
     }
    default:
     {
      #region 默认样式

      sbPage.Append("");
      #endregion
     }
     break;
   }

   output.Content.SetHtmlContent(sbPage.ToString());
   //output.TagMode = TagMode.SelfClosing;
   //return base.ProcessAsync(context, output);
  }

 }
 #endregion
}

5.效果展示

分页效果:

NET Core中怎么利用TagHelper实现分页标签

右键查看浏览器中的html元素:

NET Core中怎么利用TagHelper实现分页标签

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...