Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.
Por Rick Anderson
Nas secções seguintes, é adicionada a pesquisa de filmes por género ou nome .
Adicione o seguinte código realçado a Pages/Movies/Index.cshtml.cs:
public class IndexModel : PageModel
{
private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
{
_context = context;
}
public IList<Movie> Movie { get;set; } = default!;
[BindProperty(SupportsGet = true)]
public string? SearchString { get; set; }
public SelectList? Genres { get; set; }
[BindProperty(SupportsGet = true)]
public string? MovieGenre { get; set; }
No código anterior:
-
SearchString: Contém o texto que os utilizadores inserem na caixa de texto de pesquisa.SearchStringtem o[BindProperty]atributo.[BindProperty]liga valores de forma e cadeias de consulta com o mesmo nome da propriedade.[BindProperty(SupportsGet = true)]é necessária para a ligação em pedidos HTTP GET. -
Genres: Contém a lista de géneros.Genrespermite ao utilizador selecionar um género da lista.SelectListrequerusing Microsoft.AspNetCore.Mvc.Rendering; -
MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western". -
GenreseMovieGenresão usados mais tarde neste tutorial.
Advertência
Por motivos de segurança, você deve optar por vincular GET os dados da solicitação às propriedades do modelo de página. Verifique a entrada do usuário antes de mapeá-la para as propriedades. Optar pela vinculação GET é útil ao abordar cenários que dependem de cadeia de caracteres de consulta ou valores de rota.
Para vincular uma propriedade nas solicitações de GET, defina a propriedade [BindProperty] do atributo SupportsGet como true.
[BindProperty(SupportsGet = true)]
Para obter mais informações, consulte discussão no ASP.NET Core Community Standup sobre Bind on GET (YouTube).
Atualize o Movies/Index método da OnGetAsync página com o seguinte código:
public async Task OnGetAsync()
{
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
Movie = await movies.ToListAsync();
}
A primeira linha do OnGetAsync método cria uma consulta LINQ para selecionar os filmes:
var movies = from m in _context.Movie
select m;
A consulta só está definida neste ponto, não foi executada contra a base de dados.
Se a SearchString propriedade não null estiver ou vazia, a consulta de filmes é modificada para filtrar pela cadeia de pesquisa:
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
O s => s.Title.Contains() código é uma Expressão Lambda. Lambdas são usados em consultas LINQ baseadas em métodos como argumentos para métodos padrão de operadores de consulta, como o método Where ou Contains. As consultas LINQ não são executadas quando são definidas ou modificadas ao chamar um método, como Where, Contains, ou OrderBy. Em vez disso, a execução da consulta é diferida. A avaliação de uma expressão é adiada até que o seu valor realizado seja iterado ou o ToListAsync método seja chamado. Consulte Execução de Consultas para mais informações.
Observação
O Contains método é executado na base de dados, não no código C#. A sensibilidade a maiúsculas minúsculas na consulta depende da base de dados e da colação. No SQL Server, Contains mapeia para SQL LIKE, que não distingue minúsculas. O SQLite com a colação padrão é uma mistura de sensível a maiúsculas minúsculas e minúsculas e IN, dependendo da consulta. Para informações sobre como fazer consultas SQLite insensíveis a maiúsculas minúsculas, veja o seguinte:
Navegue até à página de Filmes e anexe uma string de consulta, como ?searchString=Ghost à URL. Por exemplo, https://localhost:5001/Movies?searchString=Ghost. Os filmes filtrados são exibidos.
Se o modelo de rota seguinte for adicionado à página de Índice, a cadeia de pesquisa pode ser passada como um segmento de URL. Por exemplo, https://localhost:5001/Movies/Ghost.
@page "{searchString?}"
A restrição de rota anterior permite pesquisar o título como dados de rota (um segmento URL) em vez de como valor de cadeia de consulta. O ? in "{searchString?}" significa que este é um parâmetro de rota opcional.
O runtime do ASP.NET Core usa a ligação de modelos para definir o valor da SearchString propriedade a partir da cadeia de consulta (?searchString=Ghost) ou dos dados de rota (https://localhost:5001/Movies/Ghost). A encadernação de modelos não distingue maiúsculas e minúsculas.
No entanto, não se pode esperar que os utilizadores modifiquem a URL para procurar um filme. Neste passo, a interface é adicionada para filtrar filmes. Se adicionaste a restrição "{searchString?}"de rota, remove-a.
Abra o Pages/Movies/Index.cshtml ficheiro e adicione a marcação destacada no seguinte código:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
<table class="table">
<thead>
A etiqueta HTML <form> utiliza os seguintes Ajudantes de Etiquetas:
- Form Tag Helper. Quando o formulário é submetido, a cadeia de filtro é enviada para a página de Páginas/Filmes/Índice através da cadeia de consulta.
- Auxiliar de Etiqueta de Entrada
Guarda as alterações e testa o filtro.
Pesquisa por género
Atualize o Movies/Index.cshtml.cs método da página OnGetAsync com o seguinte código:
public async Task OnGetAsync()
{
// <snippet_search_linqQuery>
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
// </snippet_search_linqQuery>
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
if (!string.IsNullOrEmpty(MovieGenre))
{
movies = movies.Where(x => x.Genre == MovieGenre);
}
// <snippet_search_selectList>
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
// </snippet_search_selectList>
Movie = await movies.ToListAsync();
}
O código seguinte é uma consulta LINQ que recupera todos os géneros da base de dados.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
O SelectList dos géneros é criado ao projetar os géneros distintos:
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Adicionar pesquisa por género à Razor página
Atualize o Index.cshtml<form> elemento conforme destacado na marcação seguinte:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<select asp-for="MovieGenre" asp-items="Model.Genres">
<option value="">All</option>
</select>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
Teste a aplicação pesquisando por género, por título do filme e por ambos:
Próximos passos
Nas secções seguintes, é adicionada a pesquisa de filmes por género ou nome .
Adicione o seguinte código realçado a Pages/Movies/Index.cshtml.cs:
public class IndexModel : PageModel
{
private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
{
_context = context;
}
public IList<Movie> Movie { get;set; } = default!;
[BindProperty(SupportsGet = true)]
public string? SearchString { get; set; }
public SelectList? Genres { get; set; }
[BindProperty(SupportsGet = true)]
public string? MovieGenre { get; set; }
No código anterior:
-
SearchString: Contém o texto que os utilizadores inserem na caixa de texto de pesquisa.SearchStringtem o[BindProperty]atributo.[BindProperty]liga valores de forma e cadeias de consulta com o mesmo nome da propriedade.[BindProperty(SupportsGet = true)]é necessária para a ligação em pedidos HTTP GET. -
Genres: Contém a lista de géneros.Genrespermite ao utilizador selecionar um género da lista.SelectListrequerusing Microsoft.AspNetCore.Mvc.Rendering; -
MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western". -
GenreseMovieGenresão usados mais tarde neste tutorial.
Advertência
Por motivos de segurança, você deve optar por vincular GET os dados da solicitação às propriedades do modelo de página. Verifique a entrada do usuário antes de mapeá-la para as propriedades. Optar pela vinculação GET é útil ao abordar cenários que dependem de cadeia de caracteres de consulta ou valores de rota.
Para vincular uma propriedade nas solicitações de GET, defina a propriedade [BindProperty] do atributo SupportsGet como true.
[BindProperty(SupportsGet = true)]
Para obter mais informações, consulte discussão no ASP.NET Core Community Standup sobre Bind on GET (YouTube).
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
Movie = await movies.ToListAsync();
}
A primeira linha do OnGetAsync método cria uma consulta LINQ para selecionar os filmes:
// using System.Linq;
var movies = from m in _context.Movie
select m;
A consulta só está definida neste ponto, não foi executada contra a base de dados.
Se a SearchString propriedade não null estiver ou vazia, a consulta de filmes é modificada para filtrar pela cadeia de pesquisa:
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
O s => s.Title.Contains() código é uma Expressão Lambda. Lambdas são usados em consultas LINQ baseadas em métodos como argumentos para métodos padrão de operadores de consulta, como o método Where ou Contains. As consultas LINQ não são executadas quando são definidas ou modificadas ao chamar um método, como Where, Contains, ou OrderBy. Em vez disso, a execução da consulta é diferida. A avaliação de uma expressão é adiada até que o seu valor realizado seja iterado ou o ToListAsync método seja chamado. Consulte Execução de Consultas para mais informações.
Observação
O Contains método é executado na base de dados, não no código C#. A sensibilidade a maiúsculas minúsculas na consulta depende da base de dados e da colação. No SQL Server, Contains mapeia para SQL LIKE, que não distingue minúsculas. O SQLite com a colação padrão é uma mistura de sensível a maiúsculas minúsculas e minúsculas e IN, dependendo da consulta. Para informações sobre como fazer consultas SQLite insensíveis a maiúsculas minúsculas, veja o seguinte:
Navegue até à página de Filmes e anexe uma string de consulta, como ?searchString=Ghost à URL. Por exemplo, https://localhost:5001/Movies?searchString=Ghost. Os filmes filtrados são exibidos.
Se o modelo de rota seguinte for adicionado à página de Índice, a cadeia de pesquisa pode ser passada como um segmento de URL. Por exemplo, https://localhost:5001/Movies/Ghost.
@page "{searchString?}"
A restrição de rota anterior permite pesquisar o título como dados de rota (um segmento URL) em vez de como valor de cadeia de consulta. O ? in "{searchString?}" significa que este é um parâmetro de rota opcional.
O runtime do ASP.NET Core usa a ligação de modelos para definir o valor da SearchString propriedade a partir da cadeia de consulta (?searchString=Ghost) ou dos dados de rota (https://localhost:5001/Movies/Ghost). A encadernação de modelos não distingue maiúsculas e minúsculas.
No entanto, não se pode esperar que os utilizadores modifiquem a URL para procurar um filme. Neste passo, a interface é adicionada para filtrar filmes. Se adicionaste a restrição "{searchString?}"de rota, remove-a.
Abra o Pages/Movies/Index.cshtml ficheiro e adicione a marcação destacada no seguinte código:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
<table class="table">
@*Markup removed for brevity.*@
A etiqueta HTML <form> utiliza os seguintes Ajudantes de Etiquetas:
- Form Tag Helper. Quando o formulário é submetido, a cadeia de filtro é enviada para a página de Páginas/Filmes/Índice através da cadeia de consulta.
- Auxiliar de Etiqueta de Entrada
Guarda as alterações e testa o filtro.
Pesquisa por género
Atualize o Movies/Index.cshtml.cs método da página OnGetAsync com o seguinte código:
public async Task OnGetAsync()
{
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
if (!string.IsNullOrEmpty(MovieGenre))
{
movies = movies.Where(x => x.Genre == MovieGenre);
}
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Movie = await movies.ToListAsync();
}
O código seguinte é uma consulta LINQ que recupera todos os géneros da base de dados.
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
O SelectList dos géneros é criado ao projetar os géneros distintos.
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Adicionar pesquisa por género à Razor página
Atualize o Index.cshtml<form> elemento conforme destacado na marcação seguinte:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<select asp-for="MovieGenre" asp-items="Model.Genres">
<option value="">All</option>
</select>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
Testa a aplicação pesquisando por género, por título do filme e por ambos.
Próximos passos
Nas secções seguintes, é adicionada a pesquisa de filmes por género ou nome .
Adicione o seguinte código realçado a Pages/Movies/Index.cshtml.cs:
public class IndexModel : PageModel
{
private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
{
_context = context;
}
public IList<Movie> Movie { get;set; } = default!;
[BindProperty(SupportsGet = true)]
public string? SearchString { get; set; }
public SelectList? Genres { get; set; }
[BindProperty(SupportsGet = true)]
public string? MovieGenre { get; set; }
No código anterior:
-
SearchString: Contém o texto que os utilizadores inserem na caixa de texto de pesquisa.SearchStringtem o[BindProperty]atributo.[BindProperty]liga valores de forma e cadeias de consulta com o mesmo nome da propriedade.[BindProperty(SupportsGet = true)]é necessária para a ligação em pedidos HTTP GET. -
Genres: Contém a lista de géneros.Genrespermite ao utilizador selecionar um género da lista.SelectListrequerusing Microsoft.AspNetCore.Mvc.Rendering; -
MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western". -
GenreseMovieGenresão usados mais tarde neste tutorial.
Advertência
Por motivos de segurança, você deve optar por vincular GET os dados da solicitação às propriedades do modelo de página. Verifique a entrada do usuário antes de mapeá-la para as propriedades. Optar pela vinculação GET é útil ao abordar cenários que dependem de cadeia de caracteres de consulta ou valores de rota.
Para vincular uma propriedade nas solicitações de GET, defina a propriedade [BindProperty] do atributo SupportsGet como true.
[BindProperty(SupportsGet = true)]
Para obter mais informações, consulte discussão no ASP.NET Core Community Standup sobre Bind on GET (YouTube).
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
Movie = await movies.ToListAsync();
}
A primeira linha do OnGetAsync método cria uma consulta LINQ para selecionar os filmes:
// using System.Linq;
var movies = from m in _context.Movie
select m;
A consulta só está definida neste ponto, não foi executada contra a base de dados.
Se a SearchString propriedade não null estiver ou vazia, a consulta de filmes é modificada para filtrar pela cadeia de pesquisa:
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
O s => s.Title.Contains() código é uma Expressão Lambda. Lambdas são usados em consultas LINQ baseadas em métodos como argumentos para métodos padrão de operadores de consulta, como o método Where ou Contains. As consultas LINQ não são executadas quando são definidas ou modificadas ao chamar um método, como Where, Contains, ou OrderBy. Em vez disso, a execução da consulta é diferida. A avaliação de uma expressão é adiada até que o seu valor realizado seja iterado ou o ToListAsync método seja chamado. Consulte Execução de Consultas para mais informações.
Observação
O Contains método é executado na base de dados, não no código C#. A sensibilidade a maiúsculas minúsculas na consulta depende da base de dados e da colação. No SQL Server, Contains mapeia para SQL LIKE, que não distingue minúsculas. O SQLite com a colação padrão é uma mistura de sensível a maiúsculas minúsculas e minúsculas e IN, dependendo da consulta. Para informações sobre como fazer consultas SQLite insensíveis a maiúsculas minúsculas, veja o seguinte:
Navegue até à página de Filmes e anexe uma string de consulta, como ?searchString=Ghost à URL. Por exemplo, https://localhost:5001/Movies?searchString=Ghost. Os filmes filtrados são exibidos.
Se o modelo de rota seguinte for adicionado à página de Índice, a cadeia de pesquisa pode ser passada como um segmento de URL. Por exemplo, https://localhost:5001/Movies/Ghost.
@page "{searchString?}"
A restrição de rota anterior permite pesquisar o título como dados de rota (um segmento URL) em vez de como valor de cadeia de consulta. O ? in "{searchString?}" significa que este é um parâmetro de rota opcional.
O runtime do ASP.NET Core usa a ligação de modelos para definir o valor da SearchString propriedade a partir da cadeia de consulta (?searchString=Ghost) ou dos dados de rota (https://localhost:5001/Movies/Ghost). A encadernação de modelos não distingue maiúsculas e minúsculas.
No entanto, não se pode esperar que os utilizadores modifiquem a URL para procurar um filme. Neste passo, a interface é adicionada para filtrar filmes. Se adicionaste a restrição "{searchString?}"de rota, remove-a.
Abra o Pages/Movies/Index.cshtml ficheiro e adicione a marcação destacada no seguinte código:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
<table class="table">
@*Markup removed for brevity.*@
A etiqueta HTML <form> utiliza os seguintes Ajudantes de Etiquetas:
- Form Tag Helper. Quando o formulário é submetido, a cadeia de filtro é enviada para a página de Páginas/Filmes/Índice através da cadeia de consulta.
- Auxiliar de Etiqueta de Entrada
Guarda as alterações e testa o filtro.
Pesquisa por género
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
if (!string.IsNullOrEmpty(MovieGenre))
{
movies = movies.Where(x => x.Genre == MovieGenre);
}
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Movie = await movies.ToListAsync();
}
O código seguinte é uma consulta LINQ que recupera todos os géneros da base de dados.
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
O SelectList dos géneros é criado ao projetar os géneros distintos.
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Adicionar pesquisa por género à Razor página
Atualize o Index.cshtml<form> elemento conforme destacado na marcação seguinte:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<select asp-for="MovieGenre" asp-items="Model.Genres">
<option value="">All</option>
</select>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
Testa a aplicação pesquisando por género, por título do filme e por ambos.
Próximos passos
Nas secções seguintes, é adicionada a pesquisa de filmes por género ou nome .
Adicione o seguinte código realçado a Pages/Movies/Index.cshtml.cs:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace RazorPagesMovie.Pages.Movies
{
public class IndexModel : PageModel
{
private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
{
_context = context;
}
public IList<Movie> Movie { get;set; } = default!;
[BindProperty(SupportsGet = true)]
public string ? SearchString { get; set; }
public SelectList ? Genres { get; set; }
[BindProperty(SupportsGet = true)]
public string ? MovieGenre { get; set; }
No código anterior:
-
SearchString: Contém o texto que os utilizadores inserem na caixa de texto de pesquisa.SearchStringtem o[BindProperty]atributo.[BindProperty]liga valores de forma e cadeias de consulta com o mesmo nome da propriedade.[BindProperty(SupportsGet = true)]é necessária para a ligação em pedidos HTTP GET. -
Genres: Contém a lista de géneros.Genrespermite ao utilizador selecionar um género da lista.SelectListrequerusing Microsoft.AspNetCore.Mvc.Rendering; -
MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western". -
GenreseMovieGenresão usados mais tarde neste tutorial.
Advertência
Por motivos de segurança, você deve optar por vincular GET os dados da solicitação às propriedades do modelo de página. Verifique a entrada do usuário antes de mapeá-la para as propriedades. Optar pela vinculação GET é útil ao abordar cenários que dependem de cadeia de caracteres de consulta ou valores de rota.
Para vincular uma propriedade nas solicitações de GET, defina a propriedade [BindProperty] do atributo SupportsGet como true.
[BindProperty(SupportsGet = true)]
Para obter mais informações, consulte discussão no ASP.NET Core Community Standup sobre Bind on GET (YouTube).
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
Movie = await movies.ToListAsync();
}
A primeira linha do OnGetAsync método cria uma consulta LINQ para selecionar os filmes:
// using System.Linq;
var movies = from m in _context.Movie
select m;
A consulta só está definida neste ponto, não foi executada contra a base de dados.
Se a SearchString propriedade não for nula ou vazia, a consulta de filmes é modificada para filtrar na cadeia de pesquisa:
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
O s => s.Title.Contains() código é uma Expressão Lambda. Lambdas são usados em consultas LINQ baseadas em métodos como argumentos para métodos padrão de operadores de consulta, como o método Where ou Contains. As consultas LINQ não são executadas quando são definidas ou modificadas ao chamar um método, como Where, Contains, ou OrderBy. Em vez disso, a execução da consulta é diferida. A avaliação de uma expressão é adiada até que o seu valor realizado seja iterado ou o ToListAsync método seja chamado. Consulte Execução de Consultas para mais informações.
Observação
O Contains método é executado na base de dados, não no código C#. A sensibilidade a maiúsculas minúsculas na consulta depende da base de dados e da colação. No SQL Server, Contains mapeia para SQL LIKE, que não distingue minúsculas. O SQLite com a colação padrão é uma mistura de sensível a maiúsculas minúsculas e minúsculas e IN, dependendo da consulta. Para informações sobre como fazer consultas SQLite insensíveis a maiúsculas minúsculas, veja o seguinte:
Navegue até à página de Filmes e anexe uma string de consulta, como ?searchString=Ghost à URL. Por exemplo, https://localhost:5001/Movies?searchString=Ghost. Os filmes filtrados são exibidos.
Se o modelo de rota seguinte for adicionado à página de Índice, a cadeia de pesquisa pode ser passada como um segmento de URL. Por exemplo, https://localhost:5001/Movies/Ghost.
@page "{searchString?}"
A restrição de rota anterior permite pesquisar o título como dados de rota (um segmento URL) em vez de como valor de cadeia de consulta. O ? in "{searchString?}" significa que este é um parâmetro de rota opcional.
O runtime do ASP.NET Core usa a ligação de modelos para definir o valor da SearchString propriedade a partir da cadeia de consulta (?searchString=Ghost) ou dos dados de rota (https://localhost:5001/Movies/Ghost). A encadernação de modelos não distingue maiúsculas e minúsculas.
No entanto, não se pode esperar que os utilizadores modifiquem a URL para procurar um filme. Neste passo, a interface é adicionada para filtrar filmes. Se adicionaste a restrição "{searchString?}"de rota, remove-a.
Abra o Pages/Movies/Index.cshtml ficheiro e adicione a marcação destacada no seguinte código:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
<table class="table">
@*Markup removed for brevity.*@
A etiqueta HTML <form> utiliza os seguintes Ajudantes de Etiquetas:
- Form Tag Helper. Quando o formulário é submetido, a cadeia de filtro é enviada para a página de Páginas/Filmes/Índice através da cadeia de consulta.
- Auxiliar de Etiqueta de Entrada
Guarda as alterações e testa o filtro.
Pesquisa por género
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
if (!string.IsNullOrEmpty(MovieGenre))
{
movies = movies.Where(x => x.Genre == MovieGenre);
}
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Movie = await movies.ToListAsync();
}
O código seguinte é uma consulta LINQ que recupera todos os géneros da base de dados.
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
O SelectList dos géneros é criado ao projetar os géneros distintos.
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Adicionar pesquisa por género à Razor página
Atualize o Index.cshtml<form> elemento conforme destacado na marcação seguinte:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<select asp-for="MovieGenre" asp-items="Model.Genres">
<option value="">All</option>
</select>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
Testa a aplicação pesquisando por género, por título do filme e por ambos.
Próximos passos
Nas secções seguintes, é adicionada a pesquisa de filmes por género ou nome .
Adicione o seguinte destacado usando instrução e propriedades a Pages/Movies/Index.cshtml.cs:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace RazorPagesMovie.Pages.Movies
{
public class IndexModel : PageModel
{
private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;
public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
{
_context = context;
}
public IList<Movie> Movie { get; set; }
[BindProperty(SupportsGet = true)]
public string SearchString { get; set; }
public SelectList Genres { get; set; }
[BindProperty(SupportsGet = true)]
public string MovieGenre { get; set; }
No código anterior:
-
SearchString: Contém o texto que os utilizadores inserem na caixa de texto de pesquisa.SearchStringtem o[BindProperty]atributo.[BindProperty]liga valores de forma e cadeias de consulta com o mesmo nome da propriedade.[BindProperty(SupportsGet = true)]é necessária para a ligação em pedidos HTTP GET. -
Genres: Contém a lista de géneros.Genrespermite ao utilizador selecionar um género da lista.SelectListrequerusing Microsoft.AspNetCore.Mvc.Rendering; -
MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western". -
GenreseMovieGenresão usados mais tarde neste tutorial.
Advertência
Por motivos de segurança, você deve optar por vincular GET os dados da solicitação às propriedades do modelo de página. Verifique a entrada do usuário antes de mapeá-la para as propriedades. Optar pela vinculação GET é útil ao abordar cenários que dependem de cadeia de caracteres de consulta ou valores de rota.
Para vincular uma propriedade nas solicitações de GET, defina a propriedade [BindProperty] do atributo SupportsGet como true.
[BindProperty(SupportsGet = true)]
Para obter mais informações, consulte discussão no ASP.NET Core Community Standup sobre Bind on GET (YouTube).
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
Movie = await movies.ToListAsync();
}
A primeira linha do OnGetAsync método cria uma consulta LINQ para selecionar os filmes:
// using System.Linq;
var movies = from m in _context.Movie
select m;
A consulta só está definida neste ponto, não foi executada contra a base de dados.
Se a SearchString propriedade não for nula ou vazia, a consulta de filmes é modificada para filtrar na cadeia de pesquisa:
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
O s => s.Title.Contains() código é uma Expressão Lambda. Lambdas são usados em consultas LINQ baseadas em métodos como argumentos para métodos padrão de operadores de consulta, como o método Where ou Contains. As consultas LINQ não são executadas quando são definidas ou modificadas ao chamar um método, como Where, Contains, ou OrderBy. Em vez disso, a execução da consulta é diferida. A avaliação de uma expressão é adiada até que o seu valor realizado seja iterado ou o ToListAsync método seja chamado. Consulte Execução de Consultas para mais informações.
Observação
O Contains método é executado na base de dados, não no código C#. A sensibilidade a maiúsculas minúsculas na consulta depende da base de dados e da colação. No SQL Server, Contains mapeia para SQL LIKE, que não distingue minúsculas. O SQLite com a colação padrão é uma mistura de sensível a maiúsculas minúsculas e minúsculas e IN, dependendo da consulta. Para informações sobre como fazer consultas SQLite insensíveis a maiúsculas minúsculas, veja o seguinte:
Navegue até à página de Filmes e anexe uma string de consulta, como ?searchString=Ghost à URL. Por exemplo, https://localhost:5001/Movies?searchString=Ghost. Os filmes filtrados são exibidos.
Se o modelo de rota seguinte for adicionado à página de Índice, a cadeia de pesquisa pode ser passada como um segmento de URL. Por exemplo, https://localhost:5001/Movies/Ghost.
@page "{searchString?}"
A restrição de rota anterior permite pesquisar o título como dados de rota (um segmento URL) em vez de como valor de cadeia de consulta. O ? in "{searchString?}" significa que este é um parâmetro de rota opcional.
O runtime do ASP.NET Core usa a ligação de modelos para definir o valor da SearchString propriedade a partir da cadeia de consulta (?searchString=Ghost) ou dos dados de rota (https://localhost:5001/Movies/Ghost). A encadernação de modelos não distingue maiúsculas e minúsculas.
No entanto, não se pode esperar que os utilizadores modifiquem a URL para procurar um filme. Neste passo, a interface é adicionada para filtrar filmes. Se adicionaste a restrição "{searchString?}"de rota, remove-a.
Abra o Pages/Movies/Index.cshtml ficheiro e adicione a marcação destacada no seguinte código:
@page
@model RazorPagesMovie.Pages.Movies.IndexModel
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-page="Create">Create New</a>
</p>
<form>
<p>
<label>Title: <input type="text" asp-for="SearchString" /></label>
<input type="submit" value="Filter" />
</p>
</form>
<table class="table">
@*Markup removed for brevity.*@
A etiqueta HTML <form> utiliza os seguintes Ajudantes de Etiquetas:
- Form Tag Helper. Quando o formulário é submetido, a cadeia de filtro é enviada para a página de Páginas/Filmes/Índice através da cadeia de consulta.
- Auxiliar de Etiqueta de Entrada
Guarda as alterações e testa o filtro.
Pesquisa por género
Atualize o método da OnGetAsync página de índice com o seguinte código:
public async Task OnGetAsync()
{
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
var movies = from m in _context.Movie
select m;
if (!string.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
if (!string.IsNullOrEmpty(MovieGenre))
{
movies = movies.Where(x => x.Genre == MovieGenre);
}
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Movie = await movies.ToListAsync();
}
O código seguinte é uma consulta LINQ que recupera todos os géneros da base de dados.
// Use LINQ to get list of genres.
IQueryable<string> genreQuery = from m in _context.Movie
orderby m.Genre
select m.Genre;
O SelectList dos géneros é criado ao projetar os géneros distintos.
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
Adicionar pesquisa por género à Razor página
Atualize o
Index.cshtml<form>elemento conforme destacado na marcação seguinte:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> <label>Title: <input type="text" asp-for="SearchString" /></label> <input type="submit" value="Filter" /> </p> </form> <table class="table"> @*Markup removed for brevity.*@Testa a aplicação pesquisando por género, por título do filme e por ambos.