Neste artigo vou continuar a criação de uma aplicação ASP .NET Core MVC usando o Entity Framework Core no Visual Studio. |
Estamos criando uma aplicação Web usando ASP.NET Core MVC com Entity Framework Core e Visual Studio.
No artigo anterior implementamos um conjunto de páginas web para realizar o CRUD para as entidades Estudante.
Neste artigo vamos
adicionar funcionalidades de classificação, filtragem
e paginação à página Index de Estudantes e
também criar uma página para realizar agrupamentos
simples.
Adicionar links de
classificação nas colunas da página Index
Para adicionar a classificação à página Index dos estudantes, vamos alterar o método Index do controlador EstudantesController e adicionar código à respectiva view Index.
Abra o arquivo EstudantesController.cs e altere o método Index e inclua o código destacado em azul mostrado abaixo:
// GET: Estudantes public async Task<IActionResult> Index(string ordem) { ViewData["NomeParm"] = String.IsNullOrEmpty(ordem) ? "nome_desc" : ""; ViewData["DataParm"] = ordem == "Data" ? "data_desc" : "Data";
var estudantes = from est in _context.Estudantes switch (ordem) //return View(await _context.Estudantes.ToListAsync()); |
Esse código recebe um
parâmetro ordem da query string (string de
consulta) na URL.
O valor da string de consulta é fornecida pela ASP.NET
.Core MVC como um parâmetro para o método Action.
O parâmetro será uma string que pode ser "Nome"
ou "Data", opcionalmente seguido por um
sublinhado e a seqüência de caracteres "desc"
para especificar a ordem decrescente. A ordem de
classificação padrão é ascendente.
A primeira vez que a página Index for chamada, não há
nenhuma string de consulta. Os estudantes são exibidos
em ordem crescente por sobrenome, que é o padrão
conforme estabelecido pela instrução switch.
Quando o usuário clica em uma link de cabeçalho de
coluna, o valor ordem apropriado é fornecido na
string de consulta.
Os dois elementos ViewData (NomeParm e DataParm)
são usados pela view para configurar os hiperlinks de
cabeçalho de coluna com os valores apropriados de string
de consulta.
ViewData["NomeParm"]
= String.IsNullOrEmpty(ordem) ? "nome_desc"
: "";
ViewData["DataParm"] = ordem == "Data" ? "data_desc"
: "Data";
O código usa declarações ternárias e funciona assim:
Na primeira instrução o primeiro termo especifica que se o parâmetro ordem for nulo ou vazio,o parâmetro NomeParm deve ser definido como 'nome_desc'; caso contrário, ele deve ser definido como uma string vazia;
Na segunda instrução o
primeito termo define que se o parâmetro ordem for igual
a 'Data', o parâmetro DataParm será
definido como igual a 'data_desc'; caso
contrário, ele será igual a 'Data';
Essas duas instruções permitem que a view exiba os
hiperlinks de cabeçalho da coluna da seguinte forma:
Ordem de Classificação Atual | Hyperlink Sobrenome | Hyperlink Data |
---|---|---|
Sobrenome ascending | descending | ascending |
Sobrenome descending | ascending | ascending |
Data ascending | ascending | descending |
Data descending | ascending | ascending |
O método usa o
LINQ to
Entities para especificar a coluna para classificar. O
código cria uma variável IQueryable antes da
instrução switch, modifica-a na instrução switch e chama
o método ToListAsync após a instrução
switch.
Quando você cria e modifica variáveis IQueryable,
nenhuma consulta é enviada para o banco de dados. A
consulta não é executada até converter o objeto
IQueryable em uma coleção chamando um método como
ToListAsync. Portanto, esse código resulta em uma
consulta única que não é executada até a instrução View
de retorno.
Nota: O primeiro ponto importante a destacar é que a interface IQueryable herda de IEnumerable , de forma que tudo que IEnumerable pode fazer, IQueryable também pode. A interface IQueryable é útil quando você esta consultando uma coleção que foi carregada usando LINQ ou Entity Framework e você quer aplicar um filtro nesta coleção. (Leia o artigo : NET - Comparando IEnumerable com IQueryable - Macoratti )
Agora vamos alterar o código da view Index.cshtml conforme mostrado a seguir incluindo as linhas destacadas em azul. (O código anterior foi comentado)
@model IEnumerable<UniversidadeMacoratti.Models.Estudante> @{ ViewData["Title"] = "Index"; } <h2>Estudantes</h2> <p> <a asp-action="Create">Criar Novo Estudante</a> </p> <table class="table"> <thead> <tr> <th> @*@Html.DisplayNameFor(model => model.SobreNome)*@ <a asp-action="Index" asp-route-ordem="@ViewData["NomeParm"]">@Html.DisplayNameFor(model => model.SobreNome)</a> </th> <th> @Html.DisplayNameFor(model => model.Nome) </th> <th> @*@Html.DisplayNameFor(model => model.DataMatricula)*@ <a asp-action="Index" asp-route-ordem="@ViewData["DataParm"]">@Html.DisplayNameFor(model => model.DataMatricula)</a> </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.SobreNome) </td> <td> @Html.DisplayFor(modelItem => item.Nome) </td> <td> @Html.DisplayFor(modelItem => item.DataMatricula) </td> <td> <a asp-action="Edit" asp-route-id="@item.EstudanteID">Editar</a> | <a asp-action="Details" asp-route-id="@item.EstudanteID">Detalhes</a> | <a asp-action="Delete" asp-route-id="@item.EstudanteID">Deletar</a> </td> </tr> } </tbody> </table> |
Nota: Neste código estamos usando as Tag Helpers asp-action, asp-route-ordem.
Neste código usamos a informação na propriedade ViewData para definir os hiperlinks com os valores apropriadas da string de consulta.
Execute o projeto e clique no link Sobrenome e depois no link Data de Matricula para verificar a classificação em ação.
O resultado obtido pode ser visto na figura abaixo:
Na próxima parte do
artigo vamos incluir uma caixa de Pesquisa (Search
Box) na página Index.
1 Todo aquele que crê que Jesus é o Cristo, é nascido de
Deus; e todo aquele que ama ao que o gerou também ama ao
que dele é nascido. 2 Nisto conhecemos que amamos os
filhos de Deus, quando amamos a Deus e guardamos os seus
mandamentos.
1 João 5:1,2
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Entity Framework - Conceitos Básicos - Uma visão geral - Macoratti
Entity Framework - Separando as classes das entidades do ... - Macoratti
Entity Framework 6 - Aplicação em camadas - Definindo o ... - Macoratti
C# - Cadastro de Clientes com Entity Framework em ... - Macoratti
NET - Entity Framework 5 - Operações CRUD (revisitado) - Macoratti