Exercício – Adicionar uma nova página Razor
Na unidade anterior, você obteve o código-fonte do projeto Contoso Pizza e fez algumas alterações simples na home page. Nesta unidade, você adicionará uma nova página Razor ao projeto.
Criar a página Lista de Pizzas
Para criar uma página Razor, você usará a CLI do .NET.
Como o terminal é bloqueado pelo
dotnet watchcomando, abra outro terminal clicando com o botão direito do mouse na pasta ContosoPizza no Explorer e selecione Abrir no Terminal Integrado.Na nova janela do terminal, insira o comando a seguir:
dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output PagesO comando anterior:
- Cria esses dois arquivos no namespace
ContosoPizza.Pages:- PizzaList.cshtml - a página do Razor
- PizzaList.cshtml.cs - a classe que
PageModelacompanha
- Armazena os dois arquivos no subdiretório Pages do projeto.
- Cria esses dois arquivos no namespace
Em Pages/PizzaList.cshtml, adicione o seguinte código dentro do
@{ }bloco de código:ViewData["Title"] = "Pizza List 🍕";Isso define o elemento
<title>da página.Ao final do arquivo, adicione o seguinte código:
<h1>Pizza List 🍕</h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here -->Isso adiciona um título à página, bem como dois espaços reservados para comentários HTML para a funcionalidade que você adicionará posteriormente.
Salve o arquivo. Se você está usando o GitHub Codespaces, o arquivo é salvo automaticamente.
Retorne ao terminal em execução
dotnet watche selecione Ctrl+R para recarregar o aplicativo e detectar os novos arquivos.
Adicionar a página Lista de Pizzas ao menu de navegação
Esse seria um bom momento para testar a página, mas a página não pode ser acessada no navegador porque ainda não está vinculada ao menu de navegação. Você o vinculará agora.
Abrir Páginas/Compartilhado/_Layout.cshtml.
<ul>No elemento com anavbar-navclasse (começa na linha 21), observe os<li>elementos que contêm os links para as páginas Página Inicial e privacidade. Adicione o seguinte código ao final da lista, após o<li>elemento que contém o link Privacidade :<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List 🍕</a> </li>Isso adiciona um link à página PizzaList ao menu de navegação.
Salve o arquivo. A guia do navegador com o aplicativo é atualizada automaticamente para exibir as alterações. Se você está usando o GitHub Codespaces, o arquivo é salvo automaticamente, mas você precisa atualizar a guia do navegador manualmente.
Selecione o link da Lista 🍕 de Pizza no menu de navegação. A página Lista de Pizzas é exibida.
Registrar a classe PizzaService no contêiner de injeção de dependência
A página Pizza List depende do objeto PizzaService para recuperar a lista de pizzas. Você usará a injeção de dependência para fornecer o objeto PizzaService à página. Primeiro, registre a classe PizzaService com o contêiner.
Abra Program.cs.
Na seção que adiciona serviços ao contêiner, adicione o seguinte código:
builder.Services.AddScoped<PizzaService>();Esse código registra a classe
PizzaServiceno contêiner de injeção de dependência. O métodoAddScopedindica que um objetoPizzaServiceprecisa ser criado para cada solicitação HTTP. Agora, oPizzaServicepode ser injetado em qualquer página Razor.Salve o arquivo. Se você está usando o GitHub Codespaces, o arquivo é salvo automaticamente.
Exibir uma lista de pizzas
Vamos modificar a classe PageModel da página Lista de Pizzas para recuperar a lista de pizzas do objeto PizzaService e armazená-la em uma propriedade.
Abrir Páginas/PizzaList.cshtml.cs.
Adicione as seguintes instruções
usingà parte superior do arquivo:using ContosoPizza.Models; using ContosoPizza.Services;Essas instruções importam os tipos
PizzaePizzaServiceque você usará na página.Dentro do bloco do namespace
ContosoPizza.Pages, substitua toda a classePizzaListModelpelo seguinte código:public class PizzaListModel : PageModel { private readonly PizzaService _service; public IList<Pizza> PizzaList { get;set; } = default!; public PizzaListModel(PizzaService service) { _service = service; } public void OnGet() { PizzaList = _service.GetPizzas(); } }No código anterior:
- Um
PizzaServicesomente leitura privado chamado_serviceé criado. Essa variável conterá uma referência a um objetoPizzaService.- A palavra-chave
readonlyindica que o valor da variável_servicenão pode ser alterado após ser definido no construtor.
- A palavra-chave
- Uma propriedade
PizzaListé definida para manter a lista de pizzas.- O tipo
IList<Pizza>indica que a propriedadePizzaListconterá uma lista de objetosPizza. PizzaListé inicializado paradefault!a fim de indicar ao compilador que ele será inicializado posteriormente, portanto, verificações de segurança nulas não são necessárias.
- O tipo
- O construtor aceita um objeto
PizzaService.- O objeto
PizzaServiceé fornecido pela injeção de dependência.
- O objeto
- Um método
OnGeté definido para recuperar a lista de pizzas do objetoPizzaServicee armazená-la na propriedadePizzaList.
Dica
Se você precisar de ajuda para entender a segurança nula, consulte a segurança nula em C#.
- Um
Salve o arquivo. Se você está usando o GitHub Codespaces, o arquivo é salvo automaticamente.
Volte ao terminal que executa
dotnet watche clique em Ctrl+R para recarregar o aplicativo com o serviço registrado e o novo construtor paraPizzaListModel.
Exibir a lista de pizzas
Agora que a página tem acesso à lista de pizzas, você usará essa lista para exibir as pizzas na página.
Abrir Páginas/PizzaList.cshtml.
Substitua o comentário
<!-- List of pizzas will go here -->pelo seguinte código:<table class="table mt-5"> <thead> <tr> <th scope="col">Name</th> <th scope="col">Price</th> <th scope="col">Size</th> <th scope="col">Gluten Free</th> <th scope="col">Delete</th> </tr> </thead> <tbody> @foreach (var pizza in Model.PizzaList) { <tr> <td>@pizza.Name</td> <td>@($"{pizza.Price:C}")</td> <td>@pizza.Size</td> <td>@(pizza.IsGlutenFree ? "✔️" : string.Empty)</td> <td> <form method="post" asp-page-handler="Delete" asp-route-id="@pizza.Id"> <button class="btn btn-danger">Delete</button> </form> </td> </tr> } </tbody> </table>No código anterior:
- Um elemento
<table>é criado para exibir a lista de pizzas. - Um elemento
<thead>é criado para conter o cabeçalho da tabela. - A instrução
@foreachdentro do<tbody>itera na lista de pizzas.- A propriedade
Modelrefere-se ao objetoPizzaListModelque foi criado no arquivo code-behind. - A propriedade
PizzaListrefere-se à propriedadePizzaListque foi definida no arquivo code-behind.
- A propriedade
- Cada iteração da instrução
@foreachcria um elemento<tr>para armazenar os dados de pizza:- A sintaxe Razor é usada para exibir os dados de pizza nos elementos
<td>. Essa sintaxe é usada para exibir as propriedades do objetoPizzaarmazenado na variávelpizza. Priceé formatado usando a interpolação de cadeias de caracteres em C#.- Uma expressão ternária é usada para exibir o valor da propriedade
IsGlutenFreecomo "✔️" ou uma célula em branco. - Um formulário é criado para excluir a pizza.
- O atributo
asp-page-handlerindica que o formulário deve ser enviado ao manipuladorDeleteno arquivo code-behind. Você criará esse manipulador em uma unidade posterior. - O atributo
asp-route-idindica que a propriedadeIddo objetoPizzadeve ser passada para o manipuladorDelete.
- O atributo
- A sintaxe Razor é usada para exibir os dados de pizza nos elementos
- Um elemento
Salve o arquivo. No navegador, a página Lista de Pizzas é atualizada com a lista de pizzas. Se você está usando o GitHub Codespaces, o arquivo é salvo automaticamente, mas você precisa atualizar a guia do navegador manualmente.
Ótimo trabalho! Você criou uma página Razor que exibe uma lista de pizzas. Na próxima unidade, você aprenderá sobre auxiliares de marca e manipuladores de página.