ASP.NET MVC5 實(shí)現(xiàn)分頁(yè)查詢

對(duì)于大量數(shù)據(jù)的查詢和展示使用分頁(yè)是一種不錯(cuò)的選擇痪宰,這篇文章簡(jiǎn)要介紹下自己實(shí)現(xiàn)分頁(yè)查詢的思路洋侨。

分頁(yè)需要三個(gè)變量:數(shù)據(jù)總量毡熏、每頁(yè)顯示的數(shù)據(jù)條數(shù)坦敌、當(dāng)前頁(yè)碼。

//數(shù)據(jù)總量
int dataCount;
//每頁(yè)顯示的數(shù)據(jù)條數(shù)
int pageDataCount;
int pageNumber;

根據(jù)數(shù)據(jù)總量和每頁(yè)顯示的數(shù)據(jù)條數(shù)計(jì)算出總頁(yè)數(shù)痢法,根據(jù)當(dāng)前頁(yè)碼和每頁(yè)顯示的數(shù)據(jù)條數(shù)計(jì)算出從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)的起始行號(hào)和結(jié)束行號(hào)狱窘。

//總頁(yè)數(shù)
int pageCount = (int)Math.Ceiling(dataCount/ (pageDataCount* 1.0));
int startLine = (pageNumber - 1) * PageDataCount + 1;
int endLine=startLine + PageDataCount - 1;

對(duì)于數(shù)據(jù)庫(kù)的查詢操作使用輕量級(jí)ORM框架Dapper來(lái)實(shí)現(xiàn),具體代碼如下:

protected IDbConnection CreateConnection()
{
    IDbConnection dbConnection = new SqlConnection(ConnectionString);
    dbConnection.Open();
    return dbConnection;
}

//獲取數(shù)據(jù)庫(kù)中數(shù)據(jù)的總條數(shù)
public virtual int QueryDataCount(string tableName)
{
    using (IDbConnection dbConnection = CreateConnection())
    {
        var queryResult = dbConnection.Query<int>("select count(Id) from " + tableName);
        if (queryResult == null || !queryResult.Any())
        {
            return 0;
        }
        return queryResult.First();
    }
}

public virtual IEnumerable<T> RangeQuery<T>(string tableName, int startline, int endline)
{
    if (string.IsNullOrEmpty(tableName))
    {
        throw new ArgumentNullException("表名不得為空或null");
    }
    if (startline <= 0)
    {
        throw new ArgumentOutOfRangeException("起始行號(hào)必須大于0");
    }
    if (endline - startline < 0)
    {
        throw new ArgumentOutOfRangeException("結(jié)束行號(hào)不得小于起始行號(hào)");
    }
    using (IDbConnection dbConnection = CreateConnection())
    {
        var queryResult = dbConnection.Query<T>("select  top " + (endline - startline + 1) + " * from " + tableName + " where Id not in (select top " + (startline - 1) + " Id from " + tableName + " order by Id desc) order by Id desc");
        if (queryResult != null && queryResult.Any())
        {
            return queryResult;
        }
    }
    return null;
}

繪制分頁(yè)按鈕

在App_Code文件夾中添加PageHelper.cshtml文件封裝繪制按鈕的代碼财搁,這里需要注意一點(diǎn)蘸炸,使用VS發(fā)布站點(diǎn)時(shí)App_Code文件夾中的文件不會(huì)被打包,需要手動(dòng)拷貝App_Code文件夾中的文件到站點(diǎn)中尖奔。

@*
    amount:數(shù)據(jù)總數(shù)搭儒,count:每頁(yè)顯示的數(shù)據(jù)條數(shù),redierctUrl點(diǎn)擊按鈕時(shí)的跳轉(zhuǎn)鏈接
    頁(yè)面上需引用:bootstrap.min.css
*@
@helper CreatePaginateButton(int amount, int count, string redirectUrl)
{
    <div id="pagenumber" style="position:fixed;bottom:-15px;text-align:center;width:84%">
        <nav style="text-align:center">
            <ul class="pagination">
                <li><a href="@redirectUrl/1">首頁(yè)</a></li>
                @{
                    int pageNumber = (int)Math.Ceiling(amount / (count * 1.0));
                    pageNumber = pageNumber < 1 ? 1 : pageNumber;
                    //頁(yè)面上顯示的按鈕數(shù)目(不計(jì)首頁(yè)提茁、末頁(yè)淹禾、上一頁(yè)、下一頁(yè)等按鈕)茴扁,若頁(yè)面總數(shù)超過(guò)該值則繪制按鈕分隔符
                    const int BUTTON_COUNT = 7;
                    // 按鈕分隔符
                    const string BUTTON_SEPARATOR = "......";
                    //按鈕分隔符左側(cè)按鈕數(shù)目(不計(jì)首頁(yè)铃岔、末頁(yè)、上一頁(yè)峭火、下一頁(yè)等按鈕)
                    const int LEFT_BUTTON_COUNT = 4;
                    //按鈕分隔符右側(cè)按鈕數(shù)目(不計(jì)首頁(yè)毁习、末頁(yè)智嚷、上一頁(yè)、下一頁(yè)等按鈕)
                    const int RIGHT_BUTTON_COUNT = 2;

                    string[] urlSegments = Request.Url.Segments;
                    int selectedIndex = 0;
                    int.TryParse(urlSegments[urlSegments.Length - 1], out selectedIndex);
                    int previous = (selectedIndex - 1) <= 0 ? 1 : selectedIndex - 1;
                    int next = (selectedIndex + 1 > pageNumber) ? pageNumber : selectedIndex + 1;
                    var r=Request.Cookies[""];
                    if (pageNumber > BUTTON_COUNT)
                    {
                <li><a id="next" href="@redirectUrl/@previous">上一頁(yè)</a></li>
                        for (int i = 1; i <= BUTTON_COUNT; i++)
                        {
                            if ( selectedIndex >= LEFT_BUTTON_COUNT && selectedIndex%LEFT_BUTTON_COUNT==0 && i <= LEFT_BUTTON_COUNT)
                            {
                <li><a name="pageButton" id="@selectedIndex" href="@redirectUrl/@selectedIndex">@selectedIndex</a></li>
                                int step = selectedIndex;
                                int tag = 0;
                                for (i = 1; i <= LEFT_BUTTON_COUNT; i++)
                                {
                                    tag = i + step;
                                    if (tag > pageNumber - RIGHT_BUTTON_COUNT)
                                    {
                                        if (i <= LEFT_BUTTON_COUNT)
                                        {
                                            i = LEFT_BUTTON_COUNT + 1;
                                        }
                                        break;
                                    }
                <li><a name="pageButton" id="@tag" href="@redirectUrl/@tag">@tag</a></li>
                                }
                            }
                            else if (i <= LEFT_BUTTON_COUNT && selectedIndex<LEFT_BUTTON_COUNT)
                            {
                <li><a name="pageButton" id="@i" href="@redirectUrl/@i">@i</a></li>
                            }
                            else if (i < LEFT_BUTTON_COUNT && selectedIndex>LEFT_BUTTON_COUNT)
                            {
                                int step = selectedIndex / LEFT_BUTTON_COUNT;
                                int tag = 0;
                <li><a name="pageButton" id="@(step*LEFT_BUTTON_COUNT)" href="@redirectUrl/@(step*LEFT_BUTTON_COUNT)">@(step*LEFT_BUTTON_COUNT)</a></li>
                                for (i = 1; i <= LEFT_BUTTON_COUNT; i++)
                                {
                                    tag = i + step * LEFT_BUTTON_COUNT;
                                    if (tag > pageNumber - RIGHT_BUTTON_COUNT)
                                    {
                                        if (i <= LEFT_BUTTON_COUNT)
                                        {
                                            i = LEFT_BUTTON_COUNT + 1;
                                        }
                                        break;
                                    }
                <li><a name="pageButton" id="@tag" href="@redirectUrl/@tag">@tag</a></li>
                                }
                            }
                            //繪制按鈕分隔符右側(cè)按鈕
                            if (i==BUTTON_COUNT-1)
                            {
                <li><a name="pageButton" id="@(pageNumber-1)" href="@redirectUrl/@(pageNumber-1)">@(pageNumber-1)</a></li>
                            }
                            else if(i==BUTTON_COUNT)
                            {
                <li><a name="pageButton" id="@pageNumber" href="@redirectUrl/@pageNumber">@pageNumber</a></li>
                            }
                            //繪制按鈕分隔符
                            else if (i >= BUTTON_COUNT -RIGHT_BUTTON_COUNT)
                            {
                <li><span name="pageButton">@BUTTON_SEPARATOR</span></li>
                            }
                        }
                <li><a id="next" href="@redirectUrl/@next">下一頁(yè)</a></li>
                    }
                    else
                    {
                        for (int i = 1; i <= pageNumber; i++)
                        {
                <li><a name="pageButton" id="@i" href="@redirectUrl/@i">@i</a></li>
                        }
                    }
                }
                <li><a href="@redirectUrl/@pageNumber">末頁(yè)</a></li>
            </ul>
        </nav>
    </div>
    <script>
        $(function () {
            //設(shè)置被選中按鈕的背景色
            var selected = $('#@selectedIndex');
            if (selected != undefined) {
                selected.css('background-color', '#E1E1E1');
            }
    </script>
}

在前臺(tái)頁(yè)面中調(diào)用即可繪制分頁(yè)按鈕

@PageHelper.CreatePaginateButton(246, 10, "/usermanager/attentionlist/")

下面是幾張分頁(yè)按鈕效果圖:

分頁(yè)按鈕效果圖

對(duì)應(yīng)的HTML代碼:

分頁(yè)按鈕HTML代碼

以上是自己對(duì)于實(shí)現(xiàn)分頁(yè)的思路纺且,繪制分頁(yè)按鈕的方法過(guò)長(zhǎng)盏道,不是一個(gè)好的方案,若各位讀者有更好的解決方案還望告知载碌。文章最后推薦一個(gè)簡(jiǎn)單易用的分頁(yè)組件X.PagedList猜嘱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恐仑,隨后出現(xiàn)的幾起案子泉坐,更是在濱河造成了極大的恐慌,老刑警劉巖裳仆,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腕让,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡歧斟,警方通過(guò)查閱死者的電腦和手機(jī)纯丸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)静袖,“玉大人觉鼻,你說(shuō)我怎么就攤上這事《映龋” “怎么了坠陈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捐康。 經(jīng)常有香客問(wèn)我仇矾,道長(zhǎng),這世上最難降的妖魔是什么解总? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任贮匕,我火速辦了婚禮,結(jié)果婚禮上花枫,老公的妹妹穿的比我還像新娘刻盐。我一直安慰自己,他們只是感情好劳翰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布敦锌。 她就那樣靜靜地躺著,像睡著了一般佳簸。 火紅的嫁衣襯著肌膚如雪乙墙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音伶丐,去河邊找鬼。 笑死疯特,一個(gè)胖子當(dāng)著我的面吹牛哗魂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漓雅,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼录别,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了邻吞?” 一聲冷哼從身側(cè)響起组题,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抱冷,沒(méi)想到半個(gè)月后崔列,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旺遮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年赵讯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耿眉。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出石咬,到底是詐尸還是另有隱情花颗,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布筐骇,位于F島的核電站债鸡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拥褂。R本人自食惡果不足惜娘锁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饺鹃。 院中可真熱鬧莫秆,春花似錦、人聲如沸悔详。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茄螃。三九已至缝驳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背用狱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工运怖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夏伊。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓摇展,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親溺忧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咏连,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 【編者按】本文作者為來(lái)自巴基斯坦的軟件開(kāi)發(fā)工程師 Aqeeel,主要介紹了在 SQL 查詢層面實(shí)現(xiàn) ASP.NET...
    OneAPM閱讀 600評(píng)論 0 3
  • 一鲁森、文本框?yàn)樽址?必填項(xiàng)非空校驗(yàn): 1祟滴、必填項(xiàng)未輸入--程序應(yīng)提示錯(cuò)誤; 2歌溉、必填項(xiàng)只輸入若干個(gè)空格垄懂,未輸入其它...
    許小小晴閱讀 4,615評(píng)論 0 2
  • 測(cè)試最重要的是測(cè)試思路、測(cè)試策略和測(cè)試計(jì)劃痛垛,只有這些前期工作做足埠偿,后面的測(cè)試執(zhí)行才能針對(duì)整體的產(chǎn)品測(cè)試起到事半功倍...
    雷哥說(shuō)閱讀 1,427評(píng)論 0 8
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • 想為思念寫(xiě)一首詩(shī),寫(xiě)了刪榜晦,刪了寫(xiě)冠蒋,這斷時(shí)光里,溢出的片段全是關(guān)于你抖剿。于是我寫(xiě)了滿屏的你的名字。
    遙可及閱讀 108評(píng)論 0 0