Você está deslogado

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.

  1. Dos ferramentas menu, selecione Gerenciador de pacotes NuGet e, em seguida, Package Manager Console.
  2. 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:
  3. Install-Package PagedList.Mvc
  4. Compile o projeto.

Adicionar a funcionalidade de paginação ao método Index

  1. Na Controllers\StudentController.cs, adicione uma using instrução para o PagedList namespace:
  2. using PagedList;
  3. Substitua o método Index pelo seguinte código:
  4. 
    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));
O método ToPagedList usa um número de página. Os dois pontos de interrogação representam o operador de coalescência nula. O operador de união de nulo define um valor padrão para um tipo que permite valor nulo; a expressão (page ?? 1) significa retornar o valor de page se ele tiver um valor ou retornar 1 se page for nulo.

Adicionar links de paginação à exibição índice de alunos

  1. Na Views\Student\Index.cshtml, substitua o código existente pelo código a seguir. As alterações são realçadas.
  2. 
    @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.

  3. Execute a página.
  4. 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/

Confira também