ASP .NET Core – Iniciando com ASP .NET Core MVC e Entity Framework Core no VS 2017 – Parte 05
No seguinte artigo, o autor apresenta a quinta parte de uma série focada em ASP.NET e Entity no Visual Studio.
Neste artigo, vou continuar a criação de uma aplicação ASP .NET Core MVC usando o Entity Framework Core no Visual Studio 2017.
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.
No artigo anterior, implementamos um conjunto de páginas web para realizar o CRUD para as entidades Estudante.
Estamos criando uma aplicação Web usando ASP.NET Core 1.1 MVC com Entity Framework Core 1.1 e Visual Studio 2017.
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, 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
select est;
switch (ordem)
{
case "nome_desc":
estudantes = estudantes.OrderByDescending(est => est.SobreNome);
break;
case "Data":
estudantes = estudantes.OrderBy(est => est.DataMatricula);
break;
case "data_desc":
estudantes = estudantes.OrderByDescending(est => est.DataMatricula);
break;
default:
estudantes = estudantes.OrderBy(est => est.SobreNome);
break;
}
//return View(await _context.Estudantes.ToListAsync());
return View(await estudantes.AsNoTracking().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 é 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 primeiro 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 | Hyperlink Data |
| Sobrenome ascending | descending | ascending |
| Data ascending | ascending | ascending |
| Data ascending | ascending | descending |
| Data descending | ascending | ascending |
O método usa o LINQ to Entities para especificar a coluna a classificar. O código cria uma variável IQueryable antes da instrução switch, a modifica 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 o IEnumerable pode fazer, IQueryable também pode. A interface IQueryable é útil quando você está 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 e asp-route-ordem e 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.








