Escolar Documentos
Profissional Documentos
Cultura Documentos
ASP .NET Core - Criando uma aplicação ASP .NET Core MVC
com o VS 2017 - VII
Para isso vamos implementar a funcionalidade de buscar dados no método Action Index e procurar filmes
por titulo e por gênero.
// GET: Filmes
public async Task<IActionResult> Index(string criterioBusca)
{
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(criterioBusca))
{
filmes = filmes.Where(f => f.Titulo.Contains(criterioBusca));
}
Na primeira linha do método temos uma consulta LINQ para selecionar filmes :
Na sequência verificamos se o parâmetro criterioBusca não for vazio nem nulo a consulta de filmes será
modificada para filtrar pelo critério informado o titulo dos filmes.
if (!String.IsNullOrEmpty(searchString))
{
filmes = filmes.Where(s => s.Titulo.Contains(searchString));
}
O código s => s.Titulo.Contains() é uma Expressão Lambda. As lambdas são usadas em consultas LINQ
baseadas em método como argumentos para métodos de operador de consulta padrão, como o método
Where ou Contains (usado no código acima).
As consultas LINQ não são executadas quando são definidas ou quando são modificadas chamando um
método, como Where, Contains ou OrderBy. Em vez disso, a execução da consulta é diferida. Isso
significa que a avaliação de uma expressão é atrasada até que seu valor realizado seja iterado ou o
método ToListAsync seja chamado.
Nota: O método Contains é executado no banco de dados, não no código C# mostrado acima. A
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 1/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
A seguir anexe a seguinte string de consulta (criterioBusca) na URL: ?criterioBusca=ilha e tecle Enter:
Agora vamos alterar a assinatura do método Index do controlador para usar um parâmetro chamado id ao
invês de criterioBusca.
Fazendo isso o parâmetro id irá corresponder ao marcador de possível opcional {id} usado para as rotas
padrão que foram definidas no arquivo Startup.cs :
....
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
....
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 2/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
Então a seguir vamos alterar o método Index do controlador para usar id ao invês de criterioBusca:
// GET: Filmes
public async Task<IActionResult> Index(string id)
{
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(id))
{
filmes = filmes.Where(f => f.Titulo.Contains(id));
}
Fazendo assim agora podemos passar o valor de busca como um dado de rota (o segmento da URL) ao
invês de um valor string de consulta.
Podemos agora navegar para : /Filmes/Index/ilha (onde ilha é o critério de busca que esta sendo
passado como uma informação de rota)
Fica muito mais elegante mas não seria viável ficar passando as informações modificando a URL, então
vamos adicionar na view Index.cshtml uma caixa de busca para nos ajudar a filtrar os filmes pelo critério.
Antes temos que retornar o método Index do controlador ao seu código original :
// GET: Filmes
public async Task<IActionResult> Index(string criterioBusca)
{
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(criterioBusca))
{
filmes = filmes.Where(f => f.Titulo.Contains(criterioBusca));
}
Agora abra a view Index.cshtml na pasta /Views/Filme e vamos alterar o seu código incluindo as linhas
de código destacadas em azul abaixo :
@model IEnumerable<MvcFilme.Models.Filme>
@{
ViewData["Title"] = "Index";
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 3/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
<h2>Filmes</h2>
<p>
<a asp-action="Create">Criar Novo</a>
</p>
A tag HTMl <form> usa a tag Helper Form de maneira que quando o formulário for submetido (Enviado)
a string criterioBusca será postada para a Action Index no controlador Filmes realizando o filtro:
Nota: Se você não conhece o padrão View Model leia este artigo: NET - O padrão MVVM (Model-View-
ViewModel) revisitado - Macoratti
Clique com o botão direito do mouse sobre a pasta Models e a seguir clique em Add -> Class e informe o
nome FilmeGeneroViewModel;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
namespace MvcFilme.Models
{
public class FilmeGeneroViewModel
{
public List<Filme> filmes;
public SelectList generos;
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 4/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
Essa classe será usada como nosso Model para retornar a lista de filmes e lista de gêneros para exibição
na view Index.
Agora vamos alterar o método Index do controlador FilmesController conforme o código a seguir:
// GET: Filmes
public async Task<IActionResult> Index(string filmeGenero,string criterioBusca)
{
IQueryable<string> consultaGenero = from m in _context.Filme
orderby m.Genero
select m.Genero;
if (!String.IsNullOrEmpty(criterioBusca))
{
filmes = filmes.Where(s => s.Titulo.Contains(criterioBusca));
}
if (!String.IsNullOrEmpty(filmeGenero))
{
filmes = filmes.Where(x => x.Genero == filmeGenero);
}
return View(filmeGeneroVM);
No código estamos usando uma consulta LINQ para retornar todos os gêneros dos filmes:
Depois verificamos se o parâmetro filmeGenero não é vazio nem nulo, e neste caso, a consulta de
generos será modificada para filtrar pelo critério informado no gênero dos filmes.
if (!String.IsNullOrEmpty(filmeGenero))
{
filmes = filmes.Where(x => x.Genero == filmeGenero);
}
A seguir criamos uma instância da classe FilmeGeneroViewModel() e usamos a classe SelectList para
projetar uma lista de gêneros distintas para não haver gêneros duplicados.
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 5/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
Agora vamos exibir a lista de gêneros na página Index de forma que o usuário possa escolher por qual
gênero deseja filtrar.
@model MvcFilme.Models.FilmeGeneroViewModel
@{
ViewData["Title"] = "Index";
}
<h2>Filmes</h2>
<p>
<a asp-action="Create">Criar Novo</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.filmes[0].Titulo)
</th>
<th>
@Html.DisplayNameFor(model => model.filmes[0].Lancamento)
</th>
<th>
@Html.DisplayNameFor(model => model.filmes[0].Genero)
</th>
<th>
@Html.DisplayNameFor(model => model.filmes[0].Preco)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.filmes) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Titulo)
</td>
<td>
@Html.DisplayFor(modelItem => item.Lancamento)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genero)
</td>
<td>
@Html.DisplayFor(modelItem => item.Preco)
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 6/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.ID">Editar</a> |
<a asp-action="Details" asp-route-id="@item.ID">Detalhes</a> |
<a asp-action="Delete" asp-route-id="@item.ID">Deletar</a>
</td>
</tr>
}
</tbody>
</table>
Agora execute a aplicação novamente e abra na página de filmes para visualizar as alterações que
permitem filtrar por gênero e por título do filme:
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 7/9
01/11/2019 ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - VII
Na próxima parte do artigo vamos mostrar como podemos tratar com a alteração do modelo de dados
com inclusão de novos campos.
Mas a hora vem, e agora é, em que os verdadeiros adoradores adorarão o Pai em espírito e em
verdade; porque o Pai procura a tais que assim o adorem.
Deus é Espírito, e importa que os que o adoram o adorem em espírito e em verdade.
João 4:23,24
Quer aprender C# ??
Referências:
www.macoratti.net/17/04/aspcore_mvcfilme7.htm 8/9