Adicionar paginação
Para adicionar paginação à página de índice de alunos, comece instalando o PagedList.Mvc pacote do NuGet. Em seguida, você fará alterações adicionais na Index método e adicionar links de paginação para o Index modo de exibição. PagedList.Mvc é um dos muitos paginação boa e classificação pacotes para o ASP.NET MVC e seu uso aqui destina-se apenas como um exemplo, não como uma recomendação para que ele sobre outras opções.
Instale o pacote PagedList.MVC NuGet
O NuGet PagedList.Mvc pacote instala automaticamente o PagedList pacote como uma dependência. O PagedList pacote instala um PagedList métodos de tipo e a extensão de coleção para IQueryable e IEnumerable coleções. Os métodos de extensão criam uma única página de dados em um PagedList coleção fora de seu IQueryable ou IEnumerablee o PagedList coleção fornece várias propriedades e métodos que facilitam a paginação. O PagedList.Mvc pacote instala um auxiliar de paginação que exibe os botões de paginação.
- Dos ferramentas menu, selecione Gerenciador de pacotes NuGet e, em seguida, Package Manager Console.
- No Package Manager Console janela, verifique se o origem do pacote é nuget.org e o projeto padrão é ContosoUniversitye, em seguida, digite o seguinte comando:
- Compile o projeto.
Install-Package PagedList.Mvc
Adicionar a funcionalidade de paginação ao método Index
- Na Controllers\StudentController.cs, adicione uma using instrução para o PagedList namespace:
- Substitua o método Index pelo seguinte código:
using PagedList;
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var students = from s in db.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.Contains(searchString)
|| s.FirstMidName.Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default: // Name ascending
students = students.OrderBy(s => s.LastName);
break;
}
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));
}
Este código adiciona um page parâmetro, um parâmetro de ordem de classificação atual e um parâmetro de filtro atual à assinatura do método:
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
Na primeira vez em que a página é exibida, ou se o usuário ainda não clicou em uma paginação ou classificação de link, todos os parâmetros são nulos. Se um link de paginação é clicado, o page variável contém o número da página para exibir.
Um ViewBag propriedade fornece a exibição com a ordem de classificação atual, pois isso precisa ser incluído nos links de paginação para manter a ordem de classificação igual durante a paginação:
ViewBag.CurrentSort = sortOrder;
Outra propriedade, ViewBag.CurrentFilter, fornece a exibição com a cadeia de caracteres de filtro atual. Esse valor precisa ser incluído nos links de paginação para manter as configurações de filtro durante a paginação e precisa ser restaurado para a caixa de texto quando a página é exibida novamente. Se a cadeia de caracteres de pesquisa for alterada durante a paginação, a página precisará ser redefinida como 1, porque o novo filtro pode resultar na exibição de dados diferentes. A cadeia de caracteres de pesquisa é alterada quando um valor é inserido na caixa de texto e o botão Enviar é pressionado. Nesse caso, o searchString parâmetro não for nulo.
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
No final do método, o ToPagedList método de extensão em que os alunos IQueryable objeto converte a consulta de alunos em uma única página de alunos em um tipo de coleção que dá suporte à paginação. A única página de alunos é então passada para o modo de exibição:
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));
Adicionar links de paginação à exibição índice de alunos
- Na Views\Student\Index.cshtml, substitua o código existente pelo código a seguir. As alterações são realçadas.
- Execute a página.
@model PagedList.IPagedList<ContosoUniversity.Models.Student>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Students";
}
<h2>Students</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
<table class="table">
<tr>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th>
First Name
</th>
<th>
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstMidName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EnrollmentDate)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
A instrução @model na parte superior da página especifica que a exibição agora obtém um objeto PagedList, em vez de um objeto List.
O using instrução para PagedList.Mvc fornece acesso para o auxiliar do MVC para os botões de paginação.
O código usa uma sobrecarga BeginForm que permite que ele especifique FormMethod.Get.
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
O padrão BeginForm envia dados de formulário com um POST, o que significa que os parâmetros são passados no corpo da mensagem HTTP e não na URL como cadeias de caracteres de consulta. Quando você especifica HTTP GET, os dados de formulário são passados na URL como cadeias de consulta, o que permite aos usuários marcar a URL. O diretrizes do W3C para o uso de HTTP GET recomendável que você deve usar GET quando a ação não resulta em uma atualização.
A caixa de texto é inicializada com a cadeia de caracteres de pesquisa atual quando você clica em uma nova página, você pode ver a cadeia de caracteres de pesquisa atual.
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
Os links de cabeçalho de coluna usam a cadeia de caracteres de consulta para passar a cadeia de caracteres de pesquisa atual para o controlador, de modo que o usuário possa classificar nos resultados do filtro:
@Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
O número atual de página e total de páginas é exibido.
@Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )
O PagedListPager auxiliar fornece várias opções que você pode personalizar, incluindo URLs e estilo. Para obter mais informações, consulte TroyGoode/PagedList no site do GitHub.
Clique nos links de paginação em ordens de classificação diferentes para verificar se a paginação funciona. Em seguida, insira uma cadeia de caracteres de pesquisa e tente fazer a paginação novamente para verificar se ela também funciona corretamente com a classificação e filtragem.
Fonte: https://learn.microsoft.com/pt-br/