using System;
using System.IO;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.Extensions.DependencyInjection;

namespace Dpz.Core.Web.Pager;

/// <summary>
/// 表示已Html编码的Html分页控件。
/// </summary>
public class HtmlPager : IHtmlContent
{
    private readonly IHtmlHelper _htmlHelper;
    private readonly int _currentPageIndex;
    private readonly int _pageSize;
    private readonly int _totalItemCount;
    private PagerOptions _pagerOptions;

    /// <summary>
    /// 根据HtmlHelper、总记录数、每页显示记录数、当前页索引和PagerOptions创建HtmlPager。
    /// </summary>
    /// <param name="html">此方法扩展的 HTMLHelper 实例</param>
    /// <param name="totalItemCount"></param>
    /// <param name="pageSize"></param>
    /// <param name="pageIndex"></param>
    /// <param name="pagerOptions"></param>
    public HtmlPager(
        IHtmlHelper html,
        int totalItemCount,
        int pageSize,
        int pageIndex,
        PagerOptions pagerOptions
    )
    {
        _htmlHelper = html;
        _totalItemCount = totalItemCount;
        _pageSize = pageSize;
        _currentPageIndex = pageIndex;
        _pagerOptions = pagerOptions;
    }

    /// <summary>
    /// 根据HtmlHelper、总记录数、每页显示记录数和当前页索引创建HtmlPager。
    /// </summary>
    /// <param name="html">此方法扩展的 HTMLHelper 实例</param>
    /// <param name="totalItemCount"></param>
    /// <param name="pageSize"></param>
    /// <param name="pageIndex"></param>
    public HtmlPager(IHtmlHelper html, int totalItemCount, int pageSize, int pageIndex)
        : this(html, totalItemCount, pageSize, pageIndex, null) { }

    /// <summary>
    /// 根据HtmlHelper、包含分页数据的IPagedList对象和PagerOptions创建HtmlPager。
    /// </summary>
    /// <param name="html">此方法扩展的 HTMLHelper 实例</param>
    /// <param name="pagedList"></param>
    /// <param name="pagerOptions"></param>
    public HtmlPager(IHtmlHelper html, IPagedList pagedList, PagerOptions pagerOptions)
        : this(
            html,
            pagedList.TotalItemCount,
            pagedList.PageSize,
            pagedList.CurrentPageIndex,
            pagerOptions
        ) { }

    /// <summary>
    /// 根据HtmlHelper和包含分页数据的IPagedList对象创建HtmlPager。
    /// </summary>
    /// <param name="html">此方法扩展的 HTMLHelper 实例</param>
    /// <param name="pagedList"></param>
    public HtmlPager(IHtmlHelper html, IPagedList pagedList)
        : this(html, pagedList.TotalItemCount, pagedList.PageSize, pagedList.CurrentPageIndex) { }

    /// <summary>
    ///
    /// </summary>
    /// <param name="builder"></param>
    /// <returns></returns>
    public HtmlPager Options(Action<PagerOptionsBuilder> builder)
    {
        if (_pagerOptions == null)
        {
            _pagerOptions = new PagerOptions();
        }
        builder(new PagerOptionsBuilder(_pagerOptions));
        return this;
    }

    public void WriteTo(TextWriter writer, HtmlEncoder encoder)
    {
        if (writer == null)
        {
            throw new ArgumentNullException(nameof(writer));
        }
        var totalPageCount = (int)Math.Ceiling(_totalItemCount / (double)_pageSize);
        var urlHelperFactory =
            _htmlHelper.ViewContext.HttpContext.RequestServices.GetRequiredService<IUrlHelperFactory>();
        var urlHelper = urlHelperFactory.GetUrlHelper(_htmlHelper.ViewContext);
        var pager = new PagerBuilder(
            _htmlHelper.ViewContext,
            urlHelper,
            totalPageCount,
            _currentPageIndex,
            _pagerOptions
        );
        writer.Write(pager.GenerateHtml());
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个名为 HtmlPager 的分页组件类,它是 ASP.NET Core MVC 中用于生成 HTML 分页控件的工具。让我详细解释一下这个类的结构和功能:

类概述

HtmlPager 实现了 IHtmlContent 接口,这意味着它可以直接在 Razor 视图中渲染为 HTML 内容。

核心字段

private readonly IHtmlHelper _htmlHelper;      // HTML 助手,用于生成 HTML
private readonly int _currentPageIndex;        // 当前页索引
private readonly int _pageSize;                // 每页显示的记录数
private readonly int _totalItemCount;          // 总记录数
private PagerOptions _pagerOptions;            // 分页选项配置

构造函数重载

该类提供了四个构造函数重载,支持不同的初始化方式:

  1. 完整参数构造函数:接受所有必需参数包括自定义选项
  2. 基础构造函数:接受基本分页参数,使用默认选项
  3. IPagedList + 选项构造函数:从分页列表对象和选项初始化
  4. IPagedList 构造函数:仅从分页列表对象初始化

核心方法

Options 方法

public HtmlPager Options(Action<PagerOptionsBuilder> builder)

这是一个流式配置方法,允许使用构建器模式来配置分页选项。如果 _pagerOptions 为 null,会创建一个新的实例。

WriteTo 方法

public void WriteTo(TextWriter writer, HtmlEncoder encoder)

这是 IHtmlContent 接口的核心方法,负责生成实际的 HTML 内容:

  1. 参数验证:检查 writer 参数是否为空
  2. 计算总页数:使用向上取整计算总页数
  3. 获取 URL 助手:通过依赖注入获取 IUrlHelper 实例
  4. 生成 HTML:创建 PagerBuilder 实例并生成最终的 HTML 内容

使用场景

这个类通常在以下场景中使用:

// 在 Controller 中
public IActionResult Index(int page = 1)
{
    var data = GetPagedData(page, 10); // 获取分页数据
    return View(data);
}

// 在 Razor 视图中
@{
    var pager = new HtmlPager(Html, Model.TotalCount, 10, Model.CurrentPage);
}
@pager.Options(opt => opt.SetPageSize(10).SetDisplayPages(5))

设计特点

  1. 灵活性:多个构造函数重载支持不同的使用场景
  2. 流式配置:通过 Options 方法支持链式调用
  3. 依赖注入集成:与 ASP.NET Core 的服务容器良好集成
  4. 职责分离:实际的 HTML 生成委托给 PagerBuilder 类

这个类是一个典型的 HTML 助手类,封装了分页逻辑并提供了友好的 API 接口。

评论加载中...