c# - ASP.NET MVC - 如何限制分页元素的数量并在记录较多时使用 '...'(三个点)进行过滤

标签 c# asp.net-mvc twitter-bootstrap pagination

当记录数量非常多时,分页会显示所有页面并破坏 View 。

如何插入该过滤器,该过滤器在页数中间显示“..”三个点?

这是 View 上的结果,如果记录很多,就不太实用了 enter image description here

分页类

 public class Pagination<T> where T : class
    {
        public Pagination()
        {

        }      

        public Pagination(List<T> itens, int count)
        {
            this.Count = count;
            this.List = itens;
        }
        public IEnumerable<T> List { get; set; } 
        public int Count { get; set; }
    }

存储库 在这里使用 Dapper

public Pagination<LocalDaOperacao> ObterLocalOperacaoPaginado(string nome, int pageSize, int pageNumber)
    {
        var cn = this.DbContext.Database.Connection;

        var sql = @"SELECT * FROM LOCAL_OPERACAO local 
                  WHERE (LTRIM(:Nome) IS NULL OR LTRIM(local.NOME) LIKE LTRIM(CONCAT(:Nome, '%')))
                  ORDER BY local.NOME 
                  OFFSET :pageSize * (:pageNumber - 1)  ROWS 
                  FETCH NEXT :pageSize  ROWS ONLY ";

         var sqlCount = @"SELECT COUNT(Id) FROM Local_Operacao local 
                  WHERE (:Nome IS NULL OR local.Nome LIKE CONCAT(:Nome, '%'))";

         var multi2 = cn.QueryMultiple(sqlCount, new { Nome = nome });


        var multi = cn.QueryMultiple(sql, new { Nome = nome, PageSize = pageSize, PageNumber = pageNumber });
        var locais = multi.Read<LocalDaOperacao>();
        var total = multi2.Read<int>().FirstOrDefault();

        var pagedList= new Pagination<LocalDaOperacao>()
        {
            List = locais,
            Count = total
        };

        return pagedList;
    }

Controller

 public const int PageSize = 8;    
    public ActionResult Index(string search, int pageNumber= 1 )
        {
            var pagination= _localDaOperacaoAppService.getAll(search, PageSize ,pageNumber);
            ViewBag.Total = Math.Ceiling((double)pagination.Count / PageSize);
            ViewBag.PageNumber= pageNumber;
            ViewBag.SearchRecord= search;

            return View(pagination.List);
        }

前端

    <li class="page-item">
        @if (ViewBag.PageNumber> 1)
        {
        <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= ViewBag.PageNumber- 1 })"> Anterior</a>

        }
        else
        {
            <a class="page-item disabled">
                <span class="page-link">Previus</span>
            </a>
        }
    </li>

    @{
        var currentPage= ViewBag.PageNumber;

        for (int i = 1; i <= ViewBag.Total; i++)
        {
            <li @Html.Raw(currentPage== i ? "class=\"page-item active\"" : "") )>
                <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= i })">@i</a>
            </li>
        }

    }

    <li class="page-item">
        @if (ViewBag.PageNumber< ViewBag.Total)
        {                   
             <a class="page-link" href="@Url.Action(" Index", "LocalDaOperacao" , new { search=ViewBag.SearchRecord, pageNumber=ViewBag.NumeroDePaginas + 1 })">Next</a>                 
        }
        else
        {
            <a class="page-item disabled">
                <span class="page-link">Next</span>
            </a>
        }
</ul>

最佳答案

如果你像这样分页:

上一页 | 1 | ... | 10 | 10 11 | 11 12 | 13 | 14 | 14 ...最后|下一页

您可以使用此代码:

 <ul>
    <li class="page-item">
        @if (ViewBag.PageNumber > 1)
        {
            <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= ViewBag.PageNumber- 1 })"> Anterior</a>

        }
        else
        {
            <a class="page-item disabled">
                <span class="page-link">Previus</span>
            </a>
        }
    </li>

    @{
        var currentPage = (int)ViewBag.PageNumber;
        var pageCount = (int)ViewBag.Total;

        // How many pages views right or left of currentPage
        const int PageLeft = 2;
        const int PagesRight = 2;

        // get first page befor ...
        var fromPage = Math.Max(1, currentPage - PageLeft);

        // get last page after ...
        var toPage = Math.Min(pageCount, currentPage + PagesRight);

        if (pageCount - toPage == 1)
        {
            toPage = pageCount;
        }

        if (fromPage > 1)
        {
            // view First page
            <li>
                <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= 1 })">1</a>
            </li>
            if (fromPage > 2)
            {
                // view first ...
                // calculate number page for link ..., it's middle between first page and fromPage
                var middleNumber = (int)Math.Ceiling((double)(fromPage - 2) / 2) + 1;
                <li>
                    <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= middleNumber })">...</a>
                </li>
            }
        }


        // view paginator between currentPage
        for (int i = fromPage; i <= toPage; i++)
        {
            <li @Html.Raw(currentPage == i ? "class=\"page-item active\"" : "") )>
                <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= i })">@i</a>
            </li>
        }


        // view second ...
        if (toPage < pageCount)
        {
            int middleNumber = (int)Math.Ceiling((double)(pageCount - toPage) / 2) + toPage;
            <li>
                <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= middleNumber })">...</a>
            </li>
            // view last page
            if (toPage < pageCount - 1)
            {
                <li>
                    <a class="page-link" href="@Url.Action("Index", "LocalDaOperacao", new { search= ViewBag.SearchRecord, pageNumber= pageCount })">@pageCount</a>
                </li>
            }

        }

    }

    <li class="page-item">
        @if (ViewBag.PageNumber < ViewBag.Total)
        {
            <a class="page-link" href="@Url.Action(" Index", "LocalDaOperacao" , new { search=ViewBag.SearchRecord, pageNumber=ViewBag.NumeroDePaginas + 1 })">Next</a>
        }
        else
        {
            <a class="page-item disabled">
                <span class="page-link">Next</span>
            </a>
        }
</ul>

您可以更改 PageLeft 和 PagesRight 以正确显示当前页面之前和之后的查看页面数。它的代码应该被优化,但是对于演示算法 View 链接“...”是正常的。

关于c# - ASP.NET MVC - 如何限制分页元素的数量并在记录较多时使用 '...'(三个点)进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62184025/

相关文章:

html - View 底部的白框

javascript - 无法让 HTML5 Canvas 与 Twitter Bootstrap 一起使用

css - 响应式设计 - 图像大小调整

c# - 使用手机存储中的歌曲实现播放列表 [windows phone]

asp.net-mvc - 页面 Controller 模式到底是什么?

c# - 在导航栏中显示模态

css - MVC5 Razor Response.Write - 文本位置

javascript - bootstrap - 相同大小的表单输入

c# - 使用 ref 或 out 参数编写 iron python 方法

c# - 如何将 ToList 转换为 ObservableCollection?