Close Menu
Código Simples .NETCódigo Simples .NET
    Facebook X (Twitter) Instagram
    Trending
    • Context engineering: quando o problema deixa de ser prompt e vira arquitetura
    • Clean Code (2ª edição): o que mudou e o que continua valendo
    • Sunk Cost em Arquitetura de Software: como evitar que meses de investimento virem uma armadilha
    • Guia Profissional de Prompting – Domando um ChatGPT Preguiçoso: Como Obter Respostas Completas, Profundas e Confiáveis
    • A Anatomia de um Prompt: Como Falar com a IA Como um Profissional de Tecnologia
    • Conheça os tipos de registros DNS: o guia completo sobre A, AAAA, NS, CNAME, MX, PTR, SOA, TXT, SRV, SPF e muito mais
    • Cache além do básico: por que LRU e TTL precisam andar juntos
    • Quando usar arquitetura modular — e quando não usar
    Facebook X (Twitter) Instagram
    Código Simples .NETCódigo Simples .NET
    Código Simples .NETCódigo Simples .NET
    Home»Front-End»Criar paginação em MVC asp.net C#

    Criar paginação em MVC asp.net C#

    Jhonathan SoaresBy Jhonathan Soares14 de fevereiro de 20141 Min Read Front-End
    Share
    Facebook Twitter LinkedIn WhatsApp Copy Link

    Olá pessoal!

    Sexta-feira “brava” e eu fazendo post! hehehe. Pra terminar a semana, vou passar um tutorial muito útil que me fez quebrar a cabeça anos atrás.

    É como criar uma paginação em MVC de maneira simples.

    paginacao-mvc

    Bom, inicialmente vamos criar uma Model que vai definir os componentes da nossa paginação, veja nossa model :

     
     
     public class PaginacaoModel
        {
            public int PaginaAtual { get; protected set; }
            public int TotalRegistros { get; protected set; }
            public int RegistrosPorPagina { get; protected set; }
            public int TotalPaginas { get; protected set; }
            public int Inicio { get; protected set; }
            public int Final { get; protected set; }
            public string Link { get; protected set; }
    
            public PaginacaoModel(int paginaAtual, int totalRegistros, int registrosPorPagina, string link)
            {
                this.PaginaAtual = paginaAtual;
                this.TotalRegistros = totalRegistros;
                this.RegistrosPorPagina = registrosPorPagina;
                this.Link = link;
    
                SetTotalPaginas();
                SetInicioFimPagina();
            }
    
            #region Metodos Privados
            private void SetTotalPaginas()
            {
                int qtdePaginas;
    
                if ((this.TotalRegistros % this.RegistrosPorPagina) == 0)
                    qtdePaginas = (this.TotalRegistros / this.RegistrosPorPagina);
                else
                    qtdePaginas = (this.TotalRegistros / this.RegistrosPorPagina) + 1;
    
                this.TotalPaginas = qtdePaginas;
            }
    
            private void SetInicioFimPagina()
            {
                int i = 0;
                int af = 0;
                int f = 0;
                int ai = 0;
    
                if (this.PaginaAtual - 4 < 1)
                {
                    i = 1;
                    af = Math.Abs(this.PaginaAtual - 4) + 1;
                }
                else
                    i = this.PaginaAtual - 4;
    
                if (this.PaginaAtual + 4 >= this.TotalPaginas)
                {
                    f = this.TotalPaginas;
                    ai = Math.Abs(this.TotalPaginas - this.PaginaAtual - 4);
                }
                else
                    f = this.PaginaAtual + 4;
    
                if (af + f >= this.TotalPaginas)
                    f = this.TotalPaginas;
                else
                    f = f + af;
    
                this.Final = f;
    
                if (i - ai <= 0)
                    i = 1;
                else
                    i = i - ai;
    
                this.Inicio = i;
            }
    
            public bool PossuiAnterior
            {
                get
                {
                    return (PaginaAtual > 1);
                }
            }
    
            public bool PossuiProxima
            {
                get
                {
                    return (PaginaAtual < this.TotalPaginas);
                }
            }
            #endregion
        }
        
        

     

    Com a nossa model criada, vamos criar uma partial view que vai definir nosso html :

    @model namespacedoseuprojeto.Models.PaginacaoModel
               
    @if (Model.TotalPaginas > 1)
    {
    <div class="paginacao">
        <ul class="menu-horizontal">
            <li><span class="paginas">Pág @Model.PaginaAtual de  @Model.TotalPaginas</span></li>
            @if (Model.PossuiAnterior)
            {
                <li><a class="static" href="@Model.Link&pagina=@(Model.PaginaAtual - 1)">  ◄ </a></li>
            }
            
            @for (int c = Model.Inicio; c <= Model.Final; c++)
            {
                if (c == Model.PaginaAtual)
                {
                    <li><a class="active" href="#">@c.ToString()</a></li>    
                }
                else
                {
                    <li><a href="@Model.Link&[email protected]()">@c.ToString()</a></li>    
                }
            }
    
            @if (Model.PossuiProxima)
            {
                <li><a class="static" href="@Model.Link&pagina=@(Model.PaginaAtual + 1)"> ► </a></li>
            }
        </ul>
    </div>
    }
    

     

    Claro que não podemos esquecer de criar a chamada na controller:

           public ActionResult Index(int pagina = 1)
            {
                //metodo generico de busca
                Buscar(pagina);
                return View();
            }
    
            private readonly int _registrosPorPagina = 10;
            private void Buscar(int pagina)
            {
                int totalRegistros;
    
                //Realizar o seu método de busca com o parametro de paginação
                
                //instanciar sua paginação, colocando a action e controller desejada
                PaginacaoModel paginacao = new PaginacaoModel(pagina, totalRegistros, _registrosPorPagina, Url.Action("Action", "Controller"));
                ViewBag.Paginacao = paginacao;
            }

     

    Vamos colocar alguns estilos css :

     
     .paginacao{width:100%;display:inline-block;overflow:hidden;height:25px;font:bold 12px Arial;}
     .paginacao .menu-horizontal {color:#1c69b1;}
     .paginacao .menu-horizontal .paginas {font:normal 14px Arial;display:block;margin:5px 20px 0 5px;}
     .paginacao .menu-horizontal .paginas static {font:normal 14px Arial;display:block;margin:0 20px 0 5px;}
     .paginacao .menu-horizontal a{border:1px solid #D2D2D2;border-radius:4px 4px 4px 4px;color:#333;display:block;box-shadow:0 0 3px #CDCDCFD;margin:0 4px;padding:4px;}
     .paginacao .menu-horizontal .active{color:#1C69B1;}
    

     

    E claro pra terminar a nossa chamada na view :

     
     
     @Html.Partial("_Paginacao", (namespace.Models.PaginacaoModel)ViewBag.Paginacao)
       
       

    E pronto!

    Seu projeto já funciona com paginação e tudo mais! 😉

    Ps: Para criação de métodos de paginação eu utilizei o LinqKit que é uma biblioteca que se encaixa muito bem para Entity, você pode dar uma olhada aqui.

    Pessoal, até a próxima!

    E não se esqueçam de dar aquela conferida na nossa Fã Page

    Share. Facebook Twitter LinkedIn Telegram WhatsApp Copy Link
    Jhonathan Soares
    • Website
    • Facebook
    • X (Twitter)
    • LinkedIn

    Criador do blog Código Simples e com mais 15 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist.

    Posts Relacionados

    Happy Hour com Dados #17 – Azure vs AWS vs GCP

    Front-End 26 de maio de 20211 Min Read

    Blazor .NET – CRUD com MongoDB

    C# Front-End NoSql 2 de janeiro de 20195 Mins Read

    Introdução ao Blazor, o SPA da Microsoft

    C# Front-End 29 de dezembro de 20185 Mins Read
    Newsletter

    Digite seu endereço de e-mail para receber notificações de novas publicações por e-mail.

    Junte-se a 25mil outros assinantes
    Posts recentes
    • Context engineering: quando o problema deixa de ser prompt e vira arquitetura
    • Clean Code (2ª edição): o que mudou e o que continua valendo
    • Sunk Cost em Arquitetura de Software: como evitar que meses de investimento virem uma armadilha
    • Guia Profissional de Prompting – Domando um ChatGPT Preguiçoso: Como Obter Respostas Completas, Profundas e Confiáveis
    • A Anatomia de um Prompt: Como Falar com a IA Como um Profissional de Tecnologia
    Categorias
    • Arquitetura (31)
      • Microsserviços (3)
      • Testes (2)
    • Asp.net (120)
      • C# (89)
      • Mvc (13)
    • Banco de dados (93)
      • NoSql (60)
      • Sql (38)
    • Boas práticas (34)
      • Gestão & Produtividade (4)
      • Metodologias Ágeis (6)
    • Cursos (53)
    • Dicas (108)
    • Front-End (92)
    • IA (7)
    • Linux (6)
    • NodeJS (4)
    • Post do Leitor (9)
    • Python (5)
    • Seo (12)
    • Tecnologia (30)
      • ITIL (1)
      • Padrões de Projeto (4)
    • Testes (2)

    VEJA TAMBÉM

    Cursos
    12 de fevereiro de 20166 Mins Read

    1000 livros gratuitos sobre programação!

    Olha que dica bacana! A pagina só com livros sobre programação é mantida no GitHub…

    30 APIs Gratuitas para desenvolvedores

    Código Simples no Facebook
    Código Simples no Facebook
    • Popular
    • Recente

    1000 livros gratuitos sobre programação!

    12 de fevereiro de 2016

    Google lança versão “invisível” do reCAPTCHA!

    10 de março de 2017

    Mini curso de HTML5 oferecido pela Microsoft

    30 de janeiro de 2014

    O que significa ( !important ) na declaração do CSS ?

    5 de fevereiro de 2014

    Programa para supercompactar arquivos. KGB Archiver.

    6 de fevereiro de 2014

    Context engineering: quando o problema deixa de ser prompt e vira arquitetura

    16 de abril de 2026

    Clean Code (2ª edição): o que mudou e o que continua valendo

    12 de fevereiro de 2026

    Sunk Cost em Arquitetura de Software: como evitar que meses de investimento virem uma armadilha

    4 de fevereiro de 2026

    Guia Profissional de Prompting – Domando um ChatGPT Preguiçoso: Como Obter Respostas Completas, Profundas e Confiáveis

    30 de outubro de 2025

    A Anatomia de um Prompt: Como Falar com a IA Como um Profissional de Tecnologia

    30 de outubro de 2025
    Nosso Feed
    • RSS - Posts
    Fique por dentro

    Digite seu endereço de email para assinar este blog e receber notificações de novas publicações por email.

    Facebook X (Twitter) Instagram LinkedIn

    Type above and press Enter to search. Press Esc to cancel.

    Vá para versão mobile