Partilhar via


Parte 6, adicionar pesquisa às ASP.NET Páginas Principais Razor

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. SearchString tem 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. Genres permite ao utilizador selecionar um género da lista. SelectList requer using Microsoft.AspNetCore.Mvc.Rendering;
  • MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western".
  • Genres e MovieGenre sã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.

Visualização do índice

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.

Vista de índice com a palavra fantasma adicionada ao URL e uma lista de filmes retornada de dois filmes, Ghostbusters e Ghostbusters 2

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:

Guarda as alterações e testa o filtro.

Vista de índice com a palavra fantasma escrita na caixa de texto do filtro Título

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:

Vista de índice completa com seletor de género e filtros de pesquisa por caixa de texto por título

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. SearchString tem 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. Genres permite ao utilizador selecionar um género da lista. SelectList requer using Microsoft.AspNetCore.Mvc.Rendering;
  • MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western".
  • Genres e MovieGenre sã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.

Visualização do índice

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.

Vista de índice com a palavra fantasma adicionada ao URL e uma lista de filmes retornada de dois filmes, Ghostbusters e Ghostbusters 2

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:

Guarda as alterações e testa o filtro.

Vista de índice com a palavra fantasma escrita na caixa de texto do filtro Título

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. SearchString tem 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. Genres permite ao utilizador selecionar um género da lista. SelectList requer using Microsoft.AspNetCore.Mvc.Rendering;
  • MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western".
  • Genres e MovieGenre sã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.

Visualização do índice

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.

Vista de índice com a palavra fantasma adicionada ao URL e uma lista de filmes retornada de dois filmes, Ghostbusters e Ghostbusters 2

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:

Guarda as alterações e testa o filtro.

Vista de índice com a palavra fantasma escrita na caixa de texto do filtro Título

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. SearchString tem 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. Genres permite ao utilizador selecionar um género da lista. SelectList requer using Microsoft.AspNetCore.Mvc.Rendering;
  • MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western".
  • Genres e MovieGenre sã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.

Visualização do índice

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.

Vista de índice com a palavra fantasma adicionada ao URL e uma lista de filmes retornada de dois filmes, Ghostbusters e Ghostbusters 2

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:

Guarda as alterações e testa o filtro.

Vista de índice com a palavra fantasma escrita na caixa de texto do filtro Título

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. SearchString tem 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. Genres permite ao utilizador selecionar um género da lista. SelectList requer using Microsoft.AspNetCore.Mvc.Rendering;
  • MovieGenre: Contém o género específico selecionado pelo utilizador. Por exemplo, "Western".
  • Genres e MovieGenre sã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.

Visualização do índice

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.

Vista de índice com a palavra fantasma adicionada ao URL e uma lista de filmes retornada de dois filmes, Ghostbusters e Ghostbusters 2

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:

Guarda as alterações e testa o filtro.

Vista de índice com a palavra fantasma escrita na caixa de texto do filtro Título

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

  1. 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.*@
    
    
  2. Testa a aplicação pesquisando por género, por título do filme e por ambos.

Próximos passos