热门标签 | 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


    推荐阅读
    • MySQL:不仅仅是数据库那么简单
      MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
    • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
      我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
    • 本文介绍了一种简化版的在线购物车系统,重点探讨了用户登录和购物流程的设计与实现。该系统通过优化界面交互和后端逻辑,提升了用户体验和操作便捷性。具体实现了用户注册、登录验证、商品浏览、加入购物车以及订单提交等功能,旨在为用户提供高效、流畅的购物体验。 ... [详细]
    • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
    • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
    • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
    • Jedis接口分类详解与应用指南
      本文详细解析了Jedis接口的分类及其应用指南,重点介绍了字符串数据类型(String)的接口功能。作为Redis中最基本的数据存储形式,字符串类型支持多种操作,如设置、获取和更新键值对等,适用于广泛的应用场景。 ... [详细]
    • 在 Oracle 数据库中,`NULLS FIRST` 和 `NULLS LAST` 是 `ORDER BY` 子句中用于控制空值排序位置的关键字。当使用 `NULLS FIRST` 时,无论排序顺序是升序 (`ASC`) 还是降序 (`DESC`),包含空值的记录都会被排列在结果集的最前面。相反,`NULLS LAST` 则确保空值记录被放置在结果集的最后。这些关键字提供了灵活的排序选项,特别是在处理包含大量空值的数据集时,能够更好地满足不同的业务需求。 ... [详细]
    • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
      本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
    • 利用GDAL库在Python中高效读取与处理栅格数据的详细指南 ... [详细]
    • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
      本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
    • 最大化两个非空子集之间的和的差异:集合划分策略分析 ... [详细]
    • 寻找数组 O(n) 中两数组合的最小和值 ... [详细]
    • 全面解析Python中函数的定义与应用方法【Python入门指南】
      本文将深入探讨Python中函数的定义与应用方法,帮助读者理解如何创建和调用函数,以实现代码的复用性和模块化。通过实例解析,初学者可以更好地掌握函数在实际编程中的运用。 ... [详细]
    • 精通jQuery:深入解析事件处理机制与应用技巧
      本文详细探讨了jQuery的事件处理机制及其应用技巧,通过具体的代码示例,逐一解析了每个jQuery代码片段与其对应的HTML结构。文章以标记为基准,CSS作为通用样式,确保每段代码都能独立运行。HTML和CSS代码统一放置在文章末尾,方便读者参考和实践。 ... [详细]
    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社区 版权所有