Exercício – Adicionar uma nova página do Razor
Na unidade anterior, obteve o código fonte do projeto Contoso Pizza e, em seguida, fez algumas alterações simples à home page. Nesta unidade, irá adicionar uma nova página do Razor ao projeto.
Criar a página Lista de Pizzas
Para criar uma nova página do Razor, irá utilizar a CLI do .NET.
Uma vez que o terminal está bloqueado pelo
dotnet watch
comando, abra outro terminal ao clicar com o botão direito do rato na pasta ContosoPizza no Explorador e selecione Abrir no Terminal Integrado.Na nova janela do terminal, introduza o seguinte comando:
dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output Pages
O comando anterior:
- Cria estes dois ficheiros no
ContosoPizza.Pages
espaço de nomes:- PizzaList.cshtml - a página do Razor
- PizzaList.cshtml.cs - a classe que o acompanha
PageModel
- Armazena ambos os ficheiros no subdiretório Páginas do projeto.
- Cria estes dois ficheiros no
Em Pages/PizzaList.cshtml, adicione o seguinte código dentro do
@{ }
bloco de código:ViewData["Title"] = "Pizza List 🍕";
Isto define o
<title>
elemento para a página.No final do ficheiro, adicione o seguinte código:
<h1>Pizza List 🍕</h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here -->
Esta ação adiciona um cabeçalho à página, bem como dois marcadores de posição de comentário HTML para a funcionalidade que irá adicionar mais tarde.
Guarde o ficheiro. Se estiver a utilizar o GitHub Codespaces, o ficheiro é guardado automaticamente.
Regresse ao terminal em execução
dotnet watch
e prima Ctrl+R para recarregar a aplicação e detetar os novos ficheiros.
Adicionar a página Lista de Pizzas ao menu de navegação
Esta seria uma boa altura para testar a página, mas não é possível aceder à página no browser porque ainda não está ligada no menu de navegação. Irá ligá-lo agora.
Abra Pages/Shared/_Layout.cshtml.
<ul>
No elemento com anavbar-nav
classe (começa na linha 21), tenha em atenção os<li>
elementos que contêm as ligações para as páginas Base e Privacidade. Adicione o seguinte código ao final da lista, depois do<li>
elemento que contém a ligação Privacidade :<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List 🍕</a> </li>
Esta ação adiciona uma ligação para a página PizzaList ao menu de navegação.
Guarde o ficheiro. O separador do browser com a aplicação é atualizado automaticamente para apresentar as alterações. Se estiver a utilizar o GitHub Codespaces, o ficheiro é guardado automaticamente, mas terá de atualizar o separador do browser manualmente.
Selecione a ligação Lista 🍕 de Pizzas no menu de navegação. É apresentada a página Lista de Pizzas.
Registar a classe PizzaService com o contentor de injeção de dependências
A página Lista de Pizzas depende do PizzaService
objeto para obter a lista de pizzas. Irá utilizar a injeção de dependências para fornecer o PizzaService
objeto à página. Primeiro, registe a PizzaService
classe no contentor.
Abra o Program.cs.
Na secção que adiciona serviços ao contentor, adicione o seguinte código:
builder.Services.AddScoped<PizzaService>();
Este código regista a
PizzaService
classe com o contentor de injeção de dependências. OAddScoped
método indica que deve ser criado um novoPizzaService
objeto para cada pedido HTTP. Agora, oPizzaService
pode ser injetado em qualquer página do Razor.Guarde o ficheiro. Se estiver a utilizar o GitHub Codespaces, o ficheiro é guardado automaticamente.
Apresentar uma lista de pizzas
Vamos modificar a PageModel
classe da página Lista de Pizzas para obter a lista de pizzas do PizzaService
objeto e armazená-la numa propriedade.
Abra Pages/PizzaList.cshtml.cs.
Adicione as seguintes
using
instruções à parte superior do ficheiro:using ContosoPizza.Models; using ContosoPizza.Services;
Estas instruções importam os
Pizza
tipos ePizzaService
que irá utilizar na página.Dentro do bloco de
ContosoPizza.Pages
espaço de nomes, substitua todaPizzaListModel
a classe pelo 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:
- É criado um
PizzaService
nome_service
só de leitura privado. Esta variável irá conter uma referência a umPizzaService
objeto.- A
readonly
palavra-chave indica que o valor da_service
variável não pode ser alterado depois de ser definido no construtor.
- A
- Uma
PizzaList
propriedade é definida para conter a lista de pizzas.- O
IList<Pizza>
tipo indica que aPizzaList
propriedade irá conter uma lista dePizza
objetos. PizzaList
é inicializado paradefault!
indicar ao compilador que será inicializado mais tarde, pelo que não são necessárias verificações de segurança nulas.
- O
- O construtor aceita um
PizzaService
objeto.- O
PizzaService
objeto é fornecido por injeção de dependência.
- O
- É
OnGet
definido um método para obter a lista de pizzas doPizzaService
objeto e armazená-la naPizzaList
propriedade .
Dica
Se precisar de ajuda para compreender a segurança nula, consulte Segurança nula em C#.
- É criado um
Guarde o ficheiro. Se estiver a utilizar o GitHub Codespaces, o ficheiro é guardado automaticamente.
Regresse ao terminal em execução
dotnet watch
e prima Ctrl+R para recarregar a aplicação com o serviço registado e o novo construtor paraPizzaListModel
.
Apresentar a lista de pizzas
Agora que a página tem acesso à lista de pizzas, irá utilizar essa lista para apresentar as pizzas na página.
Abra Pages/PizzaList.cshtml.
Substitua o comentário
<!-- List of pizzas will go here -->
pelo código seguinte:<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:
- É
<table>
criado um elemento para apresentar a lista de pizzas. - É
<thead>
criado um elemento para manter o cabeçalho da tabela. - A
@foreach
instrução dentro da<tbody>
itera sobre a lista de pizzas.- A
Model
propriedade refere-se aoPizzaListModel
objeto que foi criado no ficheiro code-behind. - A
PizzaList
propriedade refere-se àPizzaList
propriedade que foi definida no ficheiro code-behind.
- A
- Cada iteração da
@foreach
instrução cria um<tr>
elemento para armazenar os dados da pizza:- A sintaxe razor é utilizada para apresentar os dados da pizza nos
<td>
elementos. Esta sintaxe é utilizada para apresentar as propriedades doPizza
objeto armazenado napizza
variável . Price
é formatado com a interpolação de cadeias de carateres C#.- Uma expressão ternary é utilizada para apresentar o valor da
IsGlutenFree
propriedade como "✔️" ou uma célula em branco. - É criado um formulário para eliminar a pizza.
- O
asp-page-handler
atributo indica que o formulário deve ser submetido para oDelete
processador no ficheiro code-behind. Irá criar esse processador numa unidade posterior. - O
asp-route-id
atributo indica que aId
propriedade doPizza
objeto deve ser transmitida para oDelete
processador.
- O
- A sintaxe razor é utilizada para apresentar os dados da pizza nos
- É
Guarde o ficheiro. No browser, a página Lista de Pizzas é atualizada com a lista de pizzas. Se estiver a utilizar o GitHub Codespaces, o ficheiro é guardado automaticamente, mas terá de atualizar o separador do browser manualmente.
Bom trabalho! Criou uma página do Razor que apresenta uma lista de pizzas. Na próxima unidade, irá saber mais sobre os programadores de etiquetas e os processadores de páginas.