在 asp.net mvc中的簡單分頁算法


//第一步:建立如下分頁實體類:
namespace
MVCPager.Helpers { /// <summary> /// 簡單分頁算法類 /// </summary> public class Pager { public int RecordCount { get; set; } public int PageIndex { get; set; } public int PageSize { get; set; } public int PageCount { get { return (RecordCount - 1) / PageSize + 1; } } const int SHOW_COUNT = 6; //這個常量表示兩邊都有省略號時,中間的分頁鏈接的個數,如 1..4 5 6 7 8 9 .. 100 private List<int> CalcPages() { List<int> pages = new List<int>(); int start = (PageIndex - 1) / SHOW_COUNT * SHOW_COUNT + 1; int end = Math.Min(PageCount, start + SHOW_COUNT - 1); if (start == 1) { end = Math.Min(PageCount, end + 1); } else if (end == PageCount) { start = Math.Max(1, end - SHOW_COUNT); } pages.AddRange(Enumerable.Range(start, end - start + 1)); if (start == PageIndex && start > 2) { pages.Insert(0, start - 1); pages.RemoveAt(pages.Count - 1);//保持顯示頁號個數統一 } if (end == PageIndex && end + 1 < PageCount) { pages.Add(end + 1); pages.RemoveAt(0); //保持顯示頁號個數統一 } if (PageCount > 1) { if (pages[0] > 1) { pages.Insert(0, 1); //如果頁列表第一項不是第一頁,則在隊頭添加第一頁 } if (pages[1] == 3) { pages.Insert(1, 2); //如果是1..3這種情況,則把..換成2 } else if (pages[1] > 3) { pages.Insert(1, -1); //插入左側省略號 } if (pages.Last() == PageCount - 2) { pages.Add(PageCount - 1); //如果是 98..100這種情況,則..換成99 } else if (pages.Last() < PageCount - 2) { pages.Add(-1); //插入右側省略號 } if (pages.Last() < PageCount) { pages.Add(PageCount); //最后一頁 } } return pages; } /// <summary> /// 用於顯示的頁號數組,如果中間有小於0的頁號,則表示是省略號 /// </summary> public List<int> Pages { get { return CalcPages(); } } } }

第二步:建立一個cshtml分部頁在Views/Shared中,命名為Pager.cshtml

@using MVCPager.Helpers;
@{
    Layout = null;
    var _action = ViewContext.RouteData.Values["action"].ToString();
    Pager _pager = ViewBag.Pager as Pager;
    var routeValues = ViewContext.RouteData.Values;
    foreach (string key in Request.QueryString.Keys)
    {
        routeValues[key] = Request.QueryString[key];
    }
}

<div style="text-align:right">
    <ul class="pagination">
        @if (_pager.PageIndex == 1)
        {

            <li><a href="###">&laquo;</a></li>
        }
        else
        {
            routeValues["page"] = _pager.PageIndex - 1;

            <li>
                @Html.ActionLink("«", _action, routeValues)
            </li>
        }
        @foreach (int p in _pager.Pages)
        {
            if (p < 0)
            {
                <li><a>- - -</a></li>
            }
            else if (p == _pager.PageIndex)
            {
                <li class="active">
                    <a href="#">@p</a>
                </li>
            }
            else
            {
                routeValues["page"] = p;
                <li>@Html.ActionLink(p.ToString(), _action, routeValues)</li>
            }
        }
        @if (_pager.PageIndex == _pager.PageCount)
        {
            <li><a href="###">&raquo;</a></li>
        }
        else
        {
            routeValues["page"] = _pager.PageIndex + 1;
            <li>
                @Html.ActionLink("»", _action, routeValues)
            </li>
        }
    </ul>
</div>

 


以上操作完成后,就形成了一個可反復重用的分頁組件。

 

調用方法:
第一步:在控制器中:

            var articles = (id == null || id == 0) ? _db.Articles : _db.Articles.Where(art => art.CatalogId == id);
            var recordCount = articles.Count();
            articles = articles.OrderByDescending(art => art.EditTime)
               .Skip((page.Value - 1) * PAGE_SZ)
               .Take(PAGE_SZ);
            ViewBag.Pager = new Pager()
            {
                PageIndex = page.Value,
                PageSize = PAGE_SZ,
                RecordCount = recordCount,
            };

            return View(articles);

 

第二步:在視圖中(最后一行):

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Editor.UserName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.EditTime)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Catalog.Name)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Editor.UserName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.EditTime)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Catalog.Name)
        </td>
        <td>
            @Html.ActionLink("編輯", "Edit", new { id=item.Id }) |
            @Html.ActionLink("查看", "Details", new { id=item.Id }) |
            @Html.ActionLink("刪除", "Delete", new { id=item.Id })
        </td>
    </tr>
}

</table> @Html.Partial("Pager")


自我評價:調用還算簡單。能滿足1...5 6 7 8 9 10 ... 100 這樣的分頁樣式。

效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM