11、ASP.NET MVC入門到精通——AspnetMVC分頁

来源:http://www.cnblogs.com/jiekzou/archive/2016/01/18/5139766.html
-Advertisement-
Play Games

本系列目錄:ASP.NET MVC4入門到精通系列目錄彙總說起分頁,這基本上是我們Web開發中遇見得最多的場景,沒有之一,可即便如此,要做出比較優雅的分頁還是需要技巧的。這裡我先說一種ASP.NET MVC中很常見的一種分頁的實現方式,很low,但是很多公司的項目就是這麼用的,我現在公司的項目就是也...


本系列目錄:ASP.NET MVC4入門到精通系列目錄彙總

說起分頁,這基本上是我們Web開發中遇見得最多的場景,沒有之一,可即便如此,要做出比較優雅的分頁還是需要技巧的。這裡我先說一種ASP.NET MVC中很常見的一種分頁的實現方式,很low,但是很多公司的項目就是這麼用的,我現在公司的項目就是也是,有時候面對公司項目屎一樣的用戶體驗和雜亂的代碼,真是恨不能重寫,可是往往又眼睜睜的看著它繼續在運行,繼續摧殘著客戶,又無能為力,有時候甚至為了趕進度,還被迫強姦式的複製原有的代碼。

方式一:自定義Html擴展方法

效果如下:

1、新建介面IPageOfList

    public interface IPageOfList
    {
        long CurrentStart { get; }
        int PageIndex { get; set; }
        int PageSize { get; set; }
        int PageTotal { get; }
        long RecordTotal { get; set; }
    }

2、新建一個Html擴展方法

     public static MvcHtmlString UlPaging(this HtmlHelper helper, IPageOfList list)
        {
            StringBuilder sb = new StringBuilder();

            if (list == null)
            {
                return new MvcHtmlString(sb.ToString());
            }

            sb.AppendLine("<div class=\"fenye\">" + string.Format("<span>共 {0} 條 記錄,每頁 {1} 條 &nbsp;</span>", list.RecordTotal, list.PageSize));

            //sb.AppendLine(" <ul class=\"pagination\">");
            System.Web.Routing.RouteValueDictionary route = new System.Web.Routing.RouteValueDictionary();
            foreach (var key in helper.ViewContext.RouteData.Values.Keys)
            {
                route[key] = helper.ViewContext.RouteData.Values[key];
            }

            foreach (string key in helper.ViewContext.RequestContext.HttpContext.Request.QueryString)
            {
                route[key] = helper.ViewContext.RequestContext.HttpContext.Request.QueryString[key];
            }

            if (list.PageIndex <= 0)
            {
                sb.AppendLine("<a class=\"backpage\" href=\"javascript:void(0);\">上一頁</a>");
            }
            else
            {
                route["pageIndex"] = list.PageIndex - 1;
                //sb.AppendLine(" <li class=\"prev " + (list.PageIndex == 0 ? "disabled" : "") + "\">" + helper.ActionLink("← 上一頁", route["action"].ToString(), route).ToHtmlString() + "</li>");
                sb.AppendLine(helper.ActionLink("上一頁", route["action"].ToString(), route).ToHtmlString());
            }

            if (list.PageIndex > 3)
            {
                route["pageIndex"] = 0;
                sb.AppendLine(helper.ActionLink(@"<b>1</b>", route["action"].ToString(), route).ToHtmlString().Replace("&lt;", "<").Replace("&gt;", ">"));
                //sb.AppendLine(" <li>" + helper.ActionLink("1", route["action"].ToString(), route).ToHtmlString() + "</li>");
                if (list.PageIndex >= 5)
                {
                    sb.AppendLine("<a href='#'>..</a>");
                }
            }

            for (int i = list.PageIndex - 2; i <= list.PageIndex; i++)
            {
                if (i < 1)
                    continue;
                route["pageIndex"] = i - 1;
                //sb.AppendLine("<li" + (i == list.PageIndex + 1 ? " class=\"active\"" : "") + ">" + helper.ActionLink(i.ToString(), route["action"].ToString(), route).ToHtmlString() + "</li>");
                sb.AppendLine(helper.ActionLink(@"<b>" + i.ToString() + @"</b>", route["action"].ToString(), route).ToHtmlString().Replace("&lt;", "<").Replace("&gt;", ">"));
            }

            sb.AppendLine(@"<a class='active' href='#'><b>" + (list.PageIndex + 1) + @"</b></a>");
            for (var i = list.PageIndex + 2; i <= list.PageIndex + 4; i++)
            {
                if (i > list.PageTotal)
                    continue;
                route["pageIndex"] = i - 1;
                sb.AppendLine(helper.ActionLink(@"<b>" + i.ToString() + @"</b>", route["action"].ToString(), route).ToHtmlString().Replace("&lt;", "<").Replace("&gt;", ">"));
                //sb.AppendLine("<li" + (i == list.PageIndex + 1 ? " class=\"active\"" : "") + ">" + helper.ActionLink(i.ToString(), route["action"].ToString(), route).ToHtmlString() + "</li>");
            }

            if (list.PageIndex < list.PageTotal - 4)
            {
                if (list.PageIndex <= list.PageTotal - 6)
                {
                    sb.AppendLine("<a href='#'>..</a>");
                }
                route["pageIndex"] = list.PageTotal - 1;

                sb.AppendLine(helper.ActionLink(@"<b>" + list.PageTotal.ToString() + "</b>", route["action"].ToString(), route).ToHtmlString().Replace("&lt;", "<").Replace("&gt;", ">"));
                //sb.AppendLine(" <li>" + helper.ActionLink(list.PageTotal.ToString(), route["action"].ToString(), route).ToHtmlString() + "</li>");
            }
            if (list.PageIndex < list.PageTotal - 1)
            {
                route["pageIndex"] = list.PageIndex + 1;
                sb.AppendLine(helper.ActionLink("下一頁", route["action"].ToString(), route).ToHtmlString());
                //sb.AppendLine("<li class=\"next\">" + helper.ActionLink("下一頁 →", route["action"].ToString(), route).ToHtmlString() + "</li>");, new { @class = "nextpage" }
            }
            else
            {
                sb.AppendLine("<a class=\"nextpage\" href=\"javascript:void(0);\">下一頁</a>");
                //sb.AppendLine("<li class=\"nextpage disabled\"><a href=\"javascript:void(0);\">下一頁 →</a></li>");
            }
            sb.AppendLine("</div>");
            return new MvcHtmlString(sb.ToString());
        }

3、界面調用

@model ProjectBase.Utils.Entities.PageOfList<Uuch.MSD.Core.Orders.Order>

@Uuch.MSD.App_Start.WebHtmlHelper.UlPaging(this.Html, Model)

為什麼說這代碼屎一樣的?

界面看上去還行對吧,其實你看那個“...”點擊了是沒反應的,即便到了最後一頁,那個“下一頁”按鈕也還是顯示的,還有,沒有跳轉到指定頁的功能,當然,這些都可以自己再擴展,但是我就納悶了,有必要每一個零件都自己重新開發嗎?我們做軟體開發的,其實就像工廠里做組裝的,把現成的零部件按照圖紙拼起來就可以了,完全不需要每一個零部件重新做。

1、用戶體驗極差,每次點擊下一頁,整個界面刷新。

2、擴展性極差,各種硬編碼

3、功能很弱

方式二:第三方UI組件

用過第三方UI控制項的都知道,咱們作為Web後臺開發人員,可以節省許多調整樣式和用原生js或者jquery實現一些功能的時間,也基本上用不著去考慮各種蛋疼的相容性問題,因為這些問題,UI組件都替我們實現了。諸如ExtJs,easyUI,MiniUI,bootstrapts等等。

大家可以看下我之前寫的ASP.NET MVC搭建項目後臺UI框架—6、客戶管理(添加、修改、查詢、分頁) 在這裡我使用的是基於jquery的dataTables來實現的。

和方式一比較的優點在於

1、用戶體驗好,都是Ajax局部刷新的,而且可以支持一次性讀取所有,然後在記憶體中分頁(對於數據量不大的表而言,這樣的分頁效率很高),其次支持伺服器分頁。

2、擴展性好,界面的樣式和顯示都是可以通過屬性來配置的,基本上不存在所謂的硬編碼。

3、功能強大

大家有什麼好的想法,說出來大家一起探討下吧!

在以前,沒有使用ORM框架,使用ADO.Net的年代,我們通常分頁都是寫分頁存儲過程來實現分頁的,但是隨著ORM框架的風行,分頁變得越來越簡單。

看著那些屎一樣的項目,無論點個啥東西都把整個界面刷新,而我又不得不天天用,弄得眼睛都被閃瞎了,可是又無能為力,真心很痛苦,都說前人挖坑後人填,可是有些時候,前人坑挖得後面的人沒時間填。不由得想起一個客戶說的話:“公司系統有點爛,體驗比較差,快遞有點慢,客服比較拽,售後有點差,運費比較高”。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 導出最後一次提交修改過的文件 我一直在使用這個命令定期進行發送給其他人進行審查/整合。這條命令將把近期提交的修改過的文件導出到一個zip文件。1git archive -o ../updated.zip HEAD $(git diff --name-only HEAD^)2. 導出兩次提交之....
  • 在vs中,如果要使用柱形圖,我們大多數使用第三方提供的插件,所以必須要引用樣式,這裡我使用的是Highcharts-4.1.9插件,百度一下就可以下載到。關鍵的js代碼: .net後臺獲取資料庫數據填充:public string returnValue = "";p...
  • ModelState.Remove("Name") 去掉不需要驗證的屬性。
  • 因為看了《Entity Framework 6 Recipes 2nd Edition》這本書前面8章的翻譯,感謝china_fucan.從第九章開始,我是邊看邊譯的,沒有通讀,加之英語造詣,所以紕漏百出,也請勿見笑,就當是鼓勵!19-1 用Web Api更新單獨分離的實體29-2 用WCF更新單獨...
  • 9-4. Web API 的客戶端實現修改跟蹤問題我們想通過客戶端更新實體類,調用基於REST的Web API 服務實現把一個對象圖的插入、刪除和修改等資料庫操作。此外, 我們想通過EF6的Code First方式實現對數據的訪問。本例,我們模擬一個N層場景,用單獨的控制台應用程式作為客戶端,調用W...
  • 訂單審核完成後,庫房就可以開始備貨,安排相應的人員去揀貨了。訂單揀貨主要分為一次分揀和二次分揀,這裡我們先看下一次分揀的流程。一次分揀就是根據訂單去揀貨,可以簡單的理解為拿著一個訂單,推著購物車,把當前訂單放到購物車裡面,這樣就保證一個購物車只包含一個訂單的商品。訂單揀貨首先要進行訂單列印,然後分....
  • 參考文獻:第一篇:http://www.cnblogs.com/qinpengming/archive/2011/06/08/2075040.html第二篇:http://www.cnblogs.com/XuebinDing/archive/2012/03/27/2419497.html第三篇:ht...
  • 開發小工具的原因:1、我們公司的開發是客戶端用C#,服務端用Java,前後臺在通訊交互的時候,會用到Oracle資料庫的欄位,因為伺服器端有公司總經理開發的一個根據Oracle資料庫的表生成的class文件,每次都是等服務端都寫好了實體類以後,我們再複製、粘貼,修改欄位的類型為string,因為在生...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...