使用自定义HtmlHelpers在.NET Core MVC应用程序中实现分页

目录

介绍

背景


介绍

在本文中,让我们尝试构建自定义HtmlHelper以在.NET Core MVC应用程序中提供分页。

本文希望用户对HtmlHelpers有基本的了解。

对于那些不了解HTML助手的人,这里有一个简短的解释。

  • HTML助手使开发人员可以轻松快速地创建HTML页面。
  • 在大多数情况下,HTML助手只是一个返回string
  • MVC带有内置的HTML帮助器,如@Html.TextBox()@Html.CheckBox(),@Html.Label等。
  • razor视图中Htmlhelper呈现HTML控件。例如,@Html.TextBox()渲染<input type="textbox">控制、@Html.CheckBox()渲染<input type="checkbox">控制等。

请阅读有关HTML帮助程序的Microsoft文档

背景

Web应用程序中,如果要显示大量记录,则需要提供分页。在本文中,我们通过简单地创建一个自定义HtmlHelper.NET Core MVC应用程序来实现分页。为了简单起见,我们只使用数字来表示数据。

假设我们需要在多页中显示55条记录,每页有10个项。如上所示,我们可以在6页中显示所有项目。实时数据可以是从数据库、文件等中获取的许多记录。

让我们看看它是如何做到的。

  • 打开Visual Studio 2019 >创建.NET Core MVC应用程序,如下所示:

  • 将您的项目命名为HTMLHelpersApp

  • 选择.NET框架版本:

  • 首先,让我们创建所需的模型和帮助文件。
    • 创建一个新模型'Number'
      • 右键单击模型文件夹并添加Number类:

  • Number.cs中添加代码。该模型捕获用户输入。它只有一个属性'InputNumber'

using System;
using System.ComponentModel.DataAnnotations;

namespace HTMLHelpersApp.Models
{
    public class Number
    {
        //validation for required, only numbers, allowed range-1 to 500
        [Required(ErrorMessage = "Value is Required!. 
                                  Please enter value between 1 and 500.")]
        [RegularExpression(@"^\d+$", 
         ErrorMessage = "Only numbers are allowed. 
                         Please enter value between 1 and 500.")]
        [Range(1, 500, ErrorMessage = "Please enter value between 1 and 500.")]
        public int InputNumber = 1;
    }
}

  • 现在让我们添加一个公共类PageInfo.cs。创建新文件夹Common并添加PageInfo.cs类。
    • 右键单击项目文件夹并添加一个新文件夹:

  • PageInfo.cs中添加代码
    • Page Start表示当前页面中的第一项。
    • Page End表示当前页面的最后一项。
    • 每页的项目数表示要在页面中显示的项目数。
    • Last Page表示页数/最后页码。
    • Total Items表示项目的总数。

根据总项目数和每页项目数,计算页面总数、页面中的第一个项目和最后一个项目。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace HTMLHelpersApp.Common
{
    public class PageInfo
    {
        public int TotalItems { get; set; }
        public int ItemsPerPage { get; set; }
        public int CurrentPage { get; set; }

        public PageInfo()
        {
            CurrentPage = 1;
        }
        //starting item number in the page
        public int PageStart
        {
            get { return ((CurrentPage - 1) * ItemsPerPage + 1); }
        }
        //last item number in the page
        public int PageEnd
        {
            get
            {
                int currentTotal = (CurrentPage - 1) * ItemsPerPage + ItemsPerPage;
                return (currentTotal < TotalItems ? currentTotal : TotalItems);
            }
        }
        public int LastPage
        {
            get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
        }        
    }
}

  • 现在我们来到了最重要的部分,即创建自定义Htmlhelper
    • 创建呈现页码、上一个和下一个链接的自定义Htmlhelper PageLink
    • Common ”文件夹中添加一个新类PagingHtmlHelpers.cs ”
  • “PagingHtmlHelpers.cs中添加代码:
    • 扩展HtmlHelper类并添加新功能以添加页面链接:
      • public static IHtmlContent PageLinks(this IHtmlHelper htmlHelper, PageInfo pageInfo, Func<int, string> PageUrl)
      • 接受两个参数:
        • pageInfo
          • 添加页码
        • 委托给以整数和字符串为参数的函数
          • 在控制器动作方法中添加所需的参数
    • 使用标签构建器创建锚标签:
      • TagBuilder tag = new TagBuilder("a");
      • 添加属性:
        • tag.MergeAttribute("href", hrefValue);
        • tag.InnerHtml.Append(" "+ innerHtml + " ");
        • 样式也可以用作属性。

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Text;

namespace HTMLHelpersApp.Common
{
    public static class PagingHtmlHelpers
    {
        public static IHtmlContent PageLinks
        (this IHtmlHelper htmlHelper, PageInfo pageInfo, Func<int, string> PageUrl)
        {
            StringBuilder pagingTags = new StringBuilder();
            //Prev Page
            if (pageInfo.CurrentPage > 1)
            {
                pagingTags.Append(GetTagString
                                 ("Prev", PageUrl(pageInfo.CurrentPage - 1)));
            }
            //Page Numbers
            for (int i = 1; i <= pageInfo.LastPage; i++)
            {
                pagingTags.Append(GetTagString(i.ToString(), PageUrl(i)));
            }
            //Next Page
            if (pageInfo.CurrentPage < pageInfo.LastPage)
            {
                pagingTags.Append(GetTagString
                                 ("Next", PageUrl(pageInfo.CurrentPage + 1)));
            }
            //paging tags
            return new HtmlString(pagingTags.ToString());
        }

        private static string GetTagString(string innerHtml, string hrefValue)
        {
            TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
            tag.MergeAttribute("class","anchorstyle");
            tag.MergeAttribute("href", hrefValue);
            tag.InnerHtml.Append(" "+ innerHtml + "  ");
            using (var sw = new System.IO.StringWriter())
            {
                tag.WriteTo(sw, System.Text.Encodings.Web.HtmlEncoder.Default);
                return sw.ToString();            
            }
        }
    }
}

  • Models文件夹 中添加一个新类ShowPaging.cs”
    • DisplayResult将显示每页中的数字列表
    • PageInfo将捕获所有页面详细信息,如页数、总项目、开始项目和每页中的最后一个项目等。

using HTMLHelpersApp.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace HTMLHelpersApp.Models
{
    public class ShowPaging
    {        
        //validation for required, only numbers, allowed range-1 to 500
        [Required(ErrorMessage = "Value is Required!. 
                                  Please enter value between 1 and 500.")]
        [RegularExpression(@"^\d+$", ErrorMessage = "Only positive numbers are allowed. 
                                     Please enter value between 1 and 500.")]
        [Range(1, 500, ErrorMessage = "Please enter value between 1 and 500.")]
        public int InputNumber { get; set; }

        public List<string> DisplayResult { get; set; }

        public PageInfo PageInfo;
    }
}

  • 现在我们有了所需的模型和助手,让我们创建控制器和视图。
  • 添加一个新的控制器——'HTMLHelperController'
    • 右键单击控制器文件夹并在上下文菜单中 选择控制器。

  • 选择MVCController-Empty

  • 'HTMLHelperController'中添加代码:
    • 调用数字操作让用户输入输入的数字
    • 调用ShowPaging action以在多个页面中显示数据:
      • 单击页面链接时调用:

using HTMLHelpersApp.Common;
using HTMLHelpersApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace HTMLHelpersApp.Controllers
{
    public class HTMLHelperController : Controller
    {
        private const int PAGE_SIZE = 10;
        public IActionResult Number()
        {
            return View();
        }

        public IActionResult ShowPaging(ShowPaging model, 
                             int page = 1, int inputNumber = 1)
        {
            if (ModelState.IsValid)
            {
                var displayResult = new List<string>();
                string message;

                //set model.pageinfo
                model.PageInfo = new PageInfo();
                model.PageInfo.CurrentPage = page;
                model.PageInfo.ItemsPerPage = PAGE_SIZE;
                model.PageInfo.TotalItems = inputNumber;

                //Set model.displayresult - numbers list
                for (int count = model.PageInfo.PageStart; 
                         count <= model.PageInfo.PageEnd; count++)
                {
                    message = count.ToString();
                    displayResult.Add(message.Trim());
                }
                model.DisplayResult = displayResult;
            }
            //return view model
            return View(model);
        }
    }
}

  • Views文件夹中创建一个新文件夹HTMLHelper
    • 按照上面提到的相同步骤添加一个新文件夹。
  • 创建一个新视图Number.cshtml

    • 右键单击Views > HTMLHelper文件夹并添加一个新视图。
  • “Number.cshtml中添加代码:

@model HTMLHelpersApp.Models.Number

<h4>Number</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="ShowPaging" method="get">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <input asp-for="InputNumber" class="form-control"/>
            </div>
            <div class="form-group">
                <input type="submit" value="Submit" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

  • 同样,创建一个新视图ShowPaging.cshtml
    • 执行与上述相同的步骤:
  • “ShowPaging.cshtml中添加代码:

@model HTMLHelpersApp.Models.ShowPaging
@using HTMLHelpersApp.Common

<link rel="stylesheet" href ="~/css/anchorstyles.css"/>
<form>
    <h4>Show Paging</h4>
    <hr />
    <div asp-validation-summary="All" class="text-danger"></div>
    <dl class="row">
        <dt class="col-sm-2">
            <b>Number: </b> @Html.DisplayFor(model => model.InputNumber)
        </dt>
        <dd>
            <a asp-action="Number">Change Number</a>
        </dd>
    </dl>

    <div>
        @if (Model != null && Model.DisplayResult != null)
        {
            <ul>
                @foreach (var item in Model.DisplayResult)
                {
                    <li>@Html.Raw(item)</li>
                }
            </ul>
            <div>
                @Html.PageLinks(@Model.PageInfo, x => Url.Action("ShowPaging",
                    new { page = x.ToString(), inputNumber = @Model.InputNumber }))
            </div>
        }
    </div>        
 </form>

@Html.PageLinks是定制的HttpHelper

  • 解决方案资源管理器将如下所示:

  • 我们添加了所有必需的文件。在我们运行之前,让我们在startup.cs中配置默认​​控制器和操作。

  • 编译并运行应用程序。
  • 输入输入数字为35

  • 点击提交

  • 您会在底部看到分页。每页显示10个数字。因此,将有4页显示35个数字。单击第2页链接可查看第二页。

您可以根据需要将样式应用于页面链接。

https://www.codeproject.com/Articles/5324839/Implement-Pagination-in-NET-Core-MVC-Application-w

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值