一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](十一)

来源:https://www.cnblogs.com/bobositlife/archive/2018/03/14/8565806.html
-Advertisement-
Play Games

前言 小伙伴們, 大家好,我是Rector。 最近Rector忙於換工作,沒有太多時間來更新我們的ASP.NET MVC 5系列文章 [\[一步一步創建ASP.NET MVC5程式Repository+Autofac+Automapper+SqlSugar\]][4],直到現在才擠些時間趕緊更新一篇 ...


前言

小伙伴們,
大家好,我是Rector。
最近Rector忙於換工作,沒有太多時間來更新我們的ASP.NET MVC 5系列文章 [一步一步創建ASP.NET MVC5程式Repository+Autofac+Automapper+SqlSugar],直到現在才擠些時間趕緊更新一篇,小伙伴們等得太久了。

寫系列文章是一件並不容易的事情,相信有過寫系列文章經驗朋友也應該有所體會。

本文知識要點

本期是該系列的第十一篇,上一篇《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](十)》我們瞭解了母版頁和部分視圖,並使用母版頁和部分視圖重新組織了頁面的共用區域的HTML代碼,本文我們將要涉及到的內容為:

  • 通用分頁的封裝
  • 文章分頁的實現

通用分頁的封裝

在之前兩期中,我們的文章列表頁面是沒有分頁功能的,而是使用如下方法:

public IEnumerable<Post> FindHomePagePosts(int limit = 20)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var list = db.Queryable<Post>().OrderBy(x => x.Id, OrderByType.Desc).Take(limit).ToList();
                return list;
            }
        }

來讀取文章表中的前N(20)條記錄作為首頁的文章列表數據源。那麼,本文將為大家封裝一個通用的分頁信息類以及分頁泛型方法,並最終實現首頁文章列表的數據分頁功能。分頁效果如下圖:

一步一步創建ASP.NET MVC5程式Repository+Autofac+Automapper+SqlSugar

創建IPagedList介面及實現

打開項目TsBlog.Repositories,在此項目中分別新建兩個類:IPagedList.csPagedList.cs,代碼分別如下:

IPagedList.cs

using System.Collections.Generic;

namespace TsBlog.Repositories
{
    public interface IPagedList<T> : IList<T>
    {
        int PageIndex { get; }
        int PageSize { get; }
        int TotalCount { get; }
        int TotalPages { get; }
        bool HasPreviousPage { get; }
        bool HasNextPage { get; }
    }
}

IPagedLIst.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace TsBlog.Repositories
{
    /// <summary>
    /// 分頁組件實體類
    /// </summary>
    /// <typeparam name="T">泛型實體</typeparam>

    [Serializable]
    public class PagedList<T> : List<T>, IPagedList<T>
    {
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="source">數據源</param>
        /// <param name="pageIndex">分頁索引</param>
        /// <param name="pageSize">分頁大小</param>
        public PagedList(IQueryable<T> source, int pageIndex, int pageSize)
        {
            var total = source.Count();
            TotalCount = total;
            TotalPages = total / pageSize;

            if (total % pageSize > 0)
                TotalPages++;

            PageSize = pageSize;
            PageIndex = pageIndex;

            AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());
        }

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="source">數據源</param>
        /// <param name="pageIndex">分頁索引</param>
        /// <param name="pageSize">分頁大小</param>
        public PagedList(IList<T> source, int pageIndex, int pageSize)
        {
            TotalCount = source.Count();
            TotalPages = TotalCount / pageSize;

            if (TotalCount % pageSize > 0)
                TotalPages++;

            PageSize = pageSize;
            PageIndex = pageIndex;
            AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());
        }

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="source">數據源</param>
        /// <param name="pageIndex">分頁索引</param>
        /// <param name="pageSize">分頁大小</param>
        /// <param name="totalCount">總記錄數</param>
        public PagedList(IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)
        {
            TotalCount = totalCount;
            TotalPages = TotalCount / pageSize;

            if (TotalCount % pageSize > 0)
                TotalPages++;

            PageSize = pageSize;
            PageIndex = pageIndex;
            AddRange(source);
        }

        /// <summary>
        /// 分頁索引
        /// </summary>
        public int PageIndex { get; }
        /// <summary>
        /// 分頁大小
        /// </summary>
        public int PageSize { get; private set; }
        /// <summary>
        /// 總記錄數
        /// </summary>
        public int TotalCount { get; }
        /// <summary>
        /// 總頁數
        /// </summary>
        public int TotalPages { get; }

        /// <summary>
        /// 是否有上一頁
        /// </summary>
        public bool HasPreviousPage
        {
            get { return (PageIndex > 0); }
        }
        /// <summary>
        /// 是否有下一頁
        /// </summary>
        public bool HasNextPage
        {
            get { return (PageIndex + 1 < TotalPages); }
        }
    }
}

其中,IPagedList.cs為一個分頁信息介面,包含了分頁的基本信息,如:當前頁索引(PageIndex),分頁大小(PageSize),總記錄數(TotalCount),總頁數(TotalPages)等等。而PagedList.cs類文件則是對IPagedList.cs介面的實現。

添加泛型倉儲分頁介面

打開項目TsBlog.RepositoriesIRepository.cs 文件,在其中新建分頁介面,如下:

/// <summary>
/// 根據條件查詢分頁數據
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">當前頁面索引</param>
/// <param name="pageSize">分佈大小</param>
/// <returns></returns>
IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20);

再打開此項目中的 GenericRepository.cs 泛型倉儲實現類,在其中實現FindPagedList這個分頁方法,如下:

/// <summary>
/// 根據條件查詢分頁數據
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">當前頁面索引</param>
/// <param name="pageSize">分佈大小</param>
/// <returns></returns>
public IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20)
{
    using (var db = DbFactory.GetSqlSugarClient())
    {
        var totalCount = 0;
        var page = db.Queryable<T>().OrderBy(orderBy).ToPageList(pageIndex, pageSize, ref totalCount);
        var list = new PagedList<T>(page, pageIndex, pageSize, totalCount);
        return list;
    }
}

類似地操作,打開項目 TsBlog.Services,並打開文件 IService.cs,在其中添加分頁服務介面,如下:

/// <summary>
/// 根據條件查詢分頁數據
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">當前頁面索引</param>
/// <param name="pageSize">分佈大小</param>
/// <returns></returns>
IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20);

再打開此項目中的泛型服務類GenericService.cs,在其中實現分頁服務介面,如下:

/// <summary>
/// 根據條件查詢分頁數據
/// </summary>
/// <param name="predicate"></param>
/// <param name="orderBy"></param>
/// <param name="pageIndex">當前頁面索引</param>
/// <param name="pageSize">分佈大小</param>
/// <returns></returns>
public IPagedList<T> FindPagedList(Expression<Func<T, bool>> predicate, string orderBy = "", int pageIndex = 1, int pageSize = 20)
{
    return _repository.FindPagedList(predicate, orderBy, pageIndex, pageSize);
}

到此,我們的泛型倉儲和服務的通用分頁介面和實現就封裝完成了,現在我們需要使用以上的分頁封裝,在UI層來實現文章列表的分頁功能。

切換到項目 TsBlog.Frontend

安裝第三方分頁組件

為了方便,本示例教程使用的是第三方的分頁組件來實現UI層的分頁功能,組件為:PagedList。安裝的方式為:nuget,所以與以前幾期的nuget包安裝類似,打開nuget包管理工具,搜索關鍵詞PagedList,在查詢出來的包中,選擇PagedList.MvcPagedList兩個分頁組件包並安裝,如下:

分頁組件安裝完成之後,我們再打開 HomeController 控制器,修改Index這個ActionHomerController.cs修改後的完整代碼如下:

using PagedList;
using System.Linq;
using System.Web.Mvc;
using TsBlog.AutoMapperConfig;
using TsBlog.Frontend.Extensions;
using TsBlog.Services;
using TsBlog.ViewModel.Post;

namespace TsBlog.Frontend.Controllers
{
    public class HomeController : Controller
    {
        /// <summary>
        /// 文章服務介面
        /// </summary>
        private readonly IPostService _postService;
        public HomeController(IPostService postService)
        {
            _postService = postService;
        }
        /// <summary>
        /// 首頁
        /// </summary>
        /// <returns></returns>
        public ActionResult Index(int? page)
        {
            //var list = _postService.FindHomePagePosts();
            //讀取分頁數據,返回IPagedList<Post>
            page = page ?? 0;
            var list = _postService.FindPagedList(x => !x.IsDeleted && x.AllowShow, pageIndex: (int)page, pageSize: 10);
            var model = list.Select(x => x.ToModel().FormatPostViewModel());
            ViewBag.Pagination = new StaticPagedList<PostViewModel>(model, list.PageIndex, list.PageSize, list.TotalCount);
            return View(model);
        }
    }
}

最後,再打開Index對應的視圖文件:/Views/Home/Index.cshtml,添加分頁控制項,如下:

@using PagedList
@using PagedList.Mvc
@model IEnumerable<TsBlog.ViewModel.Post.PostViewModel>
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "ASP.NET MVC 5 系列文章教程--首頁";
}
<div class="jumbotron">
    <h1>小伙伴,你好</h1>
    <p>歡迎來到 Rector 的ASP.NET MVC 5 系列文章教程。在這裡,Rector將和你一起一步一步創建一個集成Repository+Autofac+Automapper+SqlSugar的WEB應用程式。</p>
    <p>你準備好了嗎?</p>
    <p>......</p>
    <p>讓我們開始ASP.NET MVC 5 應用程式的探索之旅吧!!!</p>
</div>
<strong class="post-title">文章列表(@(Model.Count())篇)</strong>
<ul class="list-unstyled post-item-box">
    @foreach (var p in Model)
    {
        <li>
            <h2><a href="~/post/details/@p.Id">@p.Title</a></h2>
            <p class="post-item-summary">@p.Summary ... <a href="~/post/details/@p.Id">閱讀全文</a></p>
        </li>
    }
</ul>
@Html.PagedListPager((IPagedList)ViewBag.Pagination, page => Url.Action("index", new { page }), new PagedListRenderOptions
{
    LinkToFirstPageFormat = "首頁",
    LinkToPreviousPageFormat = "上一頁",
    LinkToNextPageFormat = "下一頁",
    LinkToLastPageFormat = "末頁",
    DisplayLinkToFirstPage = PagedListDisplayMode.IfNeeded,
    DisplayLinkToLastPage = PagedListDisplayMode.Never,
    DisplayEllipsesWhenNotShowingAllPageNumbers = true,
    MaximumPageNumbersToDisplay = 5
})

以上所有更改完成後,就完成了我們對通用分頁的封裝和實現,當然,這個通用分頁是非常簡單的,只能滿足單表數據的分頁查詢和讀取。更複雜的分頁需求請自行根據思路進行實現。

完成以上步驟之後,我們重新編譯和生成項目 TsBlog.Frontend 。最後,在瀏覽器中打開地址: http://localhost:54739/ ,檢查一下,數據分頁功能是否起作用了呢?

好了,如果你喜歡Rector,或者是喜歡本系列文章,請為我點個贊,以鼓勵Rectro繼續寫出更好的文章,或者系列文章。

本期源碼托管地址:請至首發地址《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](十一)》查看

看完教程如果覺得還不過癮的,想“勾對”的,歡迎加入圖享網官方QQ群:483350228,如果你按照教程還原出來的程式運行有問題,請參照本期源碼對應調整與修改遇到問題的,也歡迎加入QQ群。有什麼,你懂的。。。^_^

謝謝你的耐心閱讀,本系列未完待續,我們下期再見……

同時,也歡迎大家關註我們的.NET編程愛好者社區:https://2sharings.com 每天都有.NET的開發技術乾貨更新哦。

[https://2sharings.com] 一個.NET編程愛好者社區,專註.NET/C#開發,幫助你找到疑難問題的更優美、更高級的解決方案


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.通過位置 'a1 = first a2= second a3= third' 'a1 = second a2= first a3= third' 註意如果{}要帶參數,可以將format看成一個函數輸入的值是函數的參數,這些輸入的值可以看成一個元組,{0} == tuple[0] 同樣他們也不能 ...
  • 本文基於 .NET Core 2.0。 鑒於網上的文章理論較多,鄙人不才,想整理一份 Hello World(Demo)版的文章。 因為使用的是 Mvc 內置的 Ioc,不需要使用 Nuget 安裝其它類庫進行引用。 場景一:簡單類的使用 類 DemoService.cs: 控制器 DemoCont ...
  • 一、帆軟報表簡介 報表工具中,帆軟報表相比Crystal Report(水晶報表)、SQL Server Report Service(SSRS)等報表工具來說算是佼佼者,此外帆軟報表在統計圖表、數據填報方面應用也不錯,此處僅針對帆軟的基本報表功能的應用說事兒。 http://www.fanruan ...
  • C# 將文件夾中文件複製到另一個文件夾 ...
  • 一.概要 本文在基於CodeFirst思想之上 深入瞭解EntityFramework。其實我個人一直頭疼的問題就是每次Entity類一有變動,無論是新增表,更改表結構等 EF一律把資料庫刪掉重建,這樣之前存在的數據一起刪除。解決方法如下: 技術上的實現是C#(.net framework4.6.1 ...
  • 今天在微軟開發人員官網上學習asp.net mvc5入門的時候,遇到一個棘手的問題,我是按照教程一步一步操作的,但期間遇到一個自己覺得莫名其妙的問題,教程中也沒有提到這個, 在添加新欄位這一章節,跟著教程操作到“update-database”後,程式包管理控制台報了一個錯誤,“Cannot att ...
  • 1、安裝 IIS(Windows專業版自帶,如果是server版系統,需要通過功能管理器安裝(無需下載)) urlrewrite插件,https://www.iis.net/downloads/microsoft/url-rewrite ARR插件(Application Request Routi ...
  • 小巧便捷配置簡單的小票雲列印是外賣微信小程式列印小票的首選方案,飛鵝雲列印是很受歡迎的雲列印服務商,本文詳細介紹瞭如何通過開放API與飛鵝雲列印對接。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...