热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用ViewComponents在Asp.NetCore中构建高效分页组件

通过运用ViewComponents技术,在Asp.NetCore中实现了高效的分页组件开发。本文详细介绍了如何通过创建`PaginationViewComponent`类并利用`HelloWorld.DataContext`上下文,实现对分页参数的定义与管理,从而提升Web应用程序的性能和用户体验。

 

分页控件(定义分页参数)

~/ViewComponents/PaginationViewComponent.cs

using HelloWorld.DataContext;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace HelloWorld.ViewComponents
{
    public class PaginationViewComponent : ViewComponent
    {
        protected readonly IHostingEnvironment Env;
        protected readonly AppBusinessDbContext BusinessDbContext;
        protected readonly ILogger Logger;

        public PaginationViewComponent(IHostingEnvironment env, AppBusinessDbContext context, ILoggerFactory loggerFactory)
        {
            Env = env;
            BusinessDbCOntext= context;
            Logger = loggerFactory.CreateLogger();
        }

        public IViewComponentResult Invoke()
        {
            return View();
        }
    }
}

~/Views/Shared/Components/Pagination/Default.cshtml

<nav>
    <ul class="pagination">
        @{
            const int pageIncrement = 2;
            const int pageTrailing = 5;
            var totalPageCount = ViewBag.TotalPageCount == null ? 1 : (int)ViewBag.TotalPageCount;
            if (totalPageCount > 1)
            {
                var pageIndex = ViewBag.CurrentPageIndex == null ? 1 : (int)ViewBag.CurrentPageIndex;
                var pageRangeStart = pageIndex <= pageIncrement ? 1 : pageIndex - pageIncrement;
                var pageRangeEnd = pageIndex + pageIncrement <= totalPageCount ? (totalPageCount > pageTrailing && pageIndex + pageIncrement < pageTrailing ? pageTrailing : pageIndex + pageIncrement) : totalPageCount;
                if (pageRangeStart > 1)
                {
                    <li class="page-item">
                        <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="1" />
                    li>
                    if (pageRangeStart > 2)
                    {
                        <li class="page-item disabled">
                            <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="..." />
                        li>
                    }
                }
                for (var i = pageRangeStart; i <= pageRangeEnd; i++)
                {
                    
  • ="page-item @(pageIndex == i ? "active" : null)"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="@i" /> li> } if (pageRangeEnd < totalPageCount) { if (pageRangeEnd + 1 ="page-item disabled"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="..." /> li> } <li class="page-item"> <input name="id" type="submit" class="page-link" style="cursor: pointer;" value="@totalPageCount" /> li> } } } ul> nav>
  •  

    列表页面(更新分页参数)

    ~/Controllers/ArticleController.cs

            public async Task List(int id, string keyword)
            {
                ViewBag.KeyWord = keyword;
                ViewBag.CurrentPageIndex = id <= 1 ? 1 : id;
                ViewBag.TotalPageCount = 1;
                if (!ModelState.IsValid) return View();
    
                List list;
                if (string.IsNullOrEmpty(keyword))
                {
                    list = await _businessDbContext.News.Join(_businessDbContext.Mapping, r => r.Gid, m => m.Gid, (r, m) => new { r, m })
                                 .Where(t => t.r.Active && t.m.UserGid == UserGid).OrderByDescending(t => t.r.Created).Select(t => t.r).ToListAsync();
                }
                else
                {
                    keyword = keyword.ToLower().Trim();
                    list = await _businessDbContext.News.Join(_businessDbContext.Mapping, r => r.Gid, m => m.Gid, (r, m) => new { r, m })
                        .Where(t => t.r.Active && t.m.UserGid == UserGid && !string.IsNullOrEmpty(t.r.Title) && t.r.Title.ToLower().Contains(keyword))
                        .OrderByDescending(t => t.r.Created)
                        .Select(t => t.r).ToListAsync();
                }
                var tmpTotalCount = list.Count;
                ViewBag.TotalPageCount = (tmpTotalCount / PageSize) + (tmpTotalCount % PageSize == 0 ? 0 : 1);
                var result = list.Skip(PageSize * (id - 1)).Take(PageSize).Select(ResumeBasicViewModel.ConvertToViewModel).ToList();
                return View(result);
            }

    ~/Views/Article/List.cshtml

            <nav class="navbar navbar-light bg-faded">
                <form asp-controller="Candidate" asp-action="List" method="GET">
                    <div class="row">
                        <div class="col-6">
                            @await Component.InvokeAsync("Pagination")
                        div>
                        <div class="col-4">
                            <input type="text" name="keyword" class="form-control" maxlength="50" placeholder="关键字" value="@ViewBag.KeyWord"/>
                        div>
                        <div class="col-1" style="padding-left: 0;">
                            <button class="form-control btn btn-success" type="submit">检 索button>
                        div>
                        <div class="col-1" style="padding-left: 0;">
                            <button class="form-control btn btn-secondary" type="submit" onclick="fnClearKeyword()">清 空button>
                        div>
                    div>
                form>
            nav>

     

    分页效果

    [Asp.Net Core] - 使用 ViewComponents 实现分页控件

     

    参考资料

    https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components


    推荐阅读
    • 技术分享:从动态网站提取站点密钥的解决方案
      本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
    • MySQL索引详解与优化
      本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
    • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
      本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
    • PHP 编程疑难解析与知识点汇总
      本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
    • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
    • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
    • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
    • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
    • 本文讨论了如何根据特定条件动态显示或隐藏文件上传控件中的默认文本(如“未选择文件”)。通过结合CSS和JavaScript,可以实现更灵活的用户界面。 ... [详细]
    • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
      本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
    • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
    • Struts与Spring框架的集成指南
      本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
    • Redux入门指南
      本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
    • Spring Boot 中静态资源映射详解
      本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
    • 深入理解Vue.js:从入门到精通
      本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
    author-avatar
    mobiledu2502885523
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有