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

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

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

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

根據(jù)數(shù)據(jù)總量和每頁顯示的數(shù)據(jù)條數(shù)計算出總頁數(shù),根據(jù)當(dāng)前頁碼和每頁顯示的數(shù)據(jù)條數(shù)計算出從數(shù)據(jù)庫中讀取數(shù)據(jù)的起始行號和結(jié)束行號。

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

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

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

//獲取數(shù)據(jù)庫中數(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("起始行號必須大于0");
    }
    if (endline - startline < 0)
    {
        throw new ArgumentOutOfRangeException("結(jié)束行號不得小于起始行號");
    }
    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;
}

繪制分頁按鈕

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

@*
    amount:數(shù)據(jù)總數(shù),count:每頁顯示的數(shù)據(jù)條數(shù),redierctUrl點(diǎn)擊按鈕時的跳轉(zhuǎn)鏈接
    頁面上需引用: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">首頁</a></li>
                @{
                    int pageNumber = (int)Math.Ceiling(amount / (count * 1.0));
                    pageNumber = pageNumber < 1 ? 1 : pageNumber;
                    //頁面上顯示的按鈕數(shù)目(不計首頁、末頁、上一頁、下一頁等按鈕),若頁面總數(shù)超過該值則繪制按鈕分隔符
                    const int BUTTON_COUNT = 7;
                    // 按鈕分隔符
                    const string BUTTON_SEPARATOR = "......";
                    //按鈕分隔符左側(cè)按鈕數(shù)目(不計首頁、末頁、上一頁、下一頁等按鈕)
                    const int LEFT_BUTTON_COUNT = 4;
                    //按鈕分隔符右側(cè)按鈕數(shù)目(不計首頁、末頁、上一頁、下一頁等按鈕)
                    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">上一頁</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">下一頁</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">末頁</a></li>
            </ul>
        </nav>
    </div>
    <script>
        $(function () {
            //設(shè)置被選中按鈕的背景色
            var selected = $('#@selectedIndex');
            if (selected != undefined) {
                selected.css('background-color', '#E1E1E1');
            }
    </script>
}

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

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

下面是幾張分頁按鈕效果圖:

分頁按鈕效果圖

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

分頁按鈕HTML代碼

以上是自己對于實(shí)現(xiàn)分頁的思路,繪制分頁按鈕的方法過長,不是一個好的方案,若各位讀者有更好的解決方案還望告知。文章最后推薦一個簡單易用的分頁組件X.PagedList。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【編者按】本文作者為來自巴基斯坦的軟件開發(fā)工程師 Aqeeel,主要介紹了在 SQL 查詢層面實(shí)現(xiàn) ASP.NET...
    OneAPM閱讀 657評論 0 3
  • 一、文本框?yàn)樽址?必填項(xiàng)非空校驗(yàn): 1、必填項(xiàng)未輸入--程序應(yīng)提示錯誤; 2、必填項(xiàng)只輸入若干個空格,未輸入其它...
    許小小晴閱讀 4,824評論 0 2
  • 測試最重要的是測試思路、測試策略和測試計劃,只有這些前期工作做足,后面的測試執(zhí)行才能針對整體的產(chǎn)品測試起到事半功倍...
    雷哥說閱讀 1,650評論 0 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,160評論 25 708
  • 想為思念寫一首詩,寫了刪,刪了寫,這斷時光里,溢出的片段全是關(guān)于你。于是我寫了滿屏的你的名字。
    遙可及閱讀 141評論 0 0

友情鏈接更多精彩內(nèi)容