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.
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

