Esercizio - Aggiungere una nuova pagina Razor
Nell'unità precedente è stato ottenuto il codice sorgente per il progetto Contoso Pizza e sono state apportate alcune semplici modifiche alla home page. In questa unità si aggiungerà una nuova pagina Razor al progetto.
Creare la pagina Pizza List
Per creare una nuova pagina Razor, si userà l'interfaccia della riga di comando di .NET.
Poiché il terminale è bloccato dal comando
dotnet watch
, aprire un altro terminale facendo clic con il pulsante destro del mouse sulla cartella ContosoPizza in Esplora risorse e scegliere Apri nel terminale integrato.Nella nuova finestra del terminale immettere il comando seguente:
dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output Pages
Il comando precedente:
- Crea questi due file nello spazio dei nomi
ContosoPizza.Pages
:- PizzaList.cshtml: la pagina Razor
- PizzaList.cshtml.cs: la classe
PageModel
corrispondente
- Archivia entrambi i file nella sottodirectory Pages del progetto.
- Crea questi due file nello spazio dei nomi
In Pages/PizzaList.cshtml aggiungere il codice seguente all'interno del blocco di codice
@{ }
:ViewData["Title"] = "Pizza List 🍕";
In questo modo viene impostato l'elemento
<title>
per la pagina.Alla fine del file aggiungere il codice seguente:
<h1>Pizza List 🍕</h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here -->
In questo modo viene aggiunta un'intestazione alla pagina, nonché due segnaposto di commento HTML per le funzionalità che verranno aggiunte in un secondo momento.
Salvare il file. Se si usa GitHub Codespaces, il file viene salvato automaticamente.
Tornare al terminale che esegue
dotnet watch
e selezionare Ctrl+R per ricaricare l'app e rilevare i nuovi file.
Aggiungere la pagina Pizza List al menu di spostamento
Questo sarebbe un buon momento per testare la pagina, ma la pagina non può essere raggiunta nel browser perché non è ancora collegata nel menu di spostamento. Verrà collegata ora.
Aprire Pages/Shared/_Layout.cshtml.
Nell'elemento
<ul>
con la classenavbar-nav
(inizia alla riga 21), prendere nota degli elementi<li>
che contengono i collegamenti alle pagine Home e Privacy. Aggiungere il codice seguente alla fine dell'elenco, dopo l'elemento<li>
contenente il collegamento Privacy:<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List 🍕</a> </li>
Verrà aggiunto un collegamento alla pagina PizzaList nel menu di spostamento.
Salvare il file. La scheda del browser con l'app viene aggiornata automaticamente per mostrare le modifiche. Se si usa GitHub Codespaces, il file viene salvato automaticamente, ma sarà necessario aggiornare manualmente la scheda del browser.
Selezionare il collegamento Pizza List 🍕 nel menu di spostamento. Viene visualizzata la pagina Pizza List.
Registrare la classe PizzaService con il contenitore di inserimento delle dipendenze
La pagina Pizza List dipende dall'oggetto PizzaService
per recuperare l'elenco delle pizze. Si userà l'inserimento delle dipendenze per fornire l'oggetto PizzaService
alla pagina. Registrare prima di tutto la classe PizzaService
con il contenitore.
Aprire Program.cs.
Nella sezione che aggiunge servizi al contenitore aggiungere il codice seguente:
builder.Services.AddScoped<PizzaService>();
Questo codice registra la classe
PizzaService
con il contenitore di inserimento delle dipendenze. Il metodoAddScoped
indica che deve essere creato un nuovo oggettoPizzaService
per ogni richiesta HTTP. Ora l'oggettoPizzaService
può essere inserito in qualsiasi pagina Razor.Salvare il file. Se si usa GitHub Codespaces, il file viene salvato automaticamente.
Visualizzare un elenco di pizze
Modificare la classe PageModel
per la pagina Pizza List per recuperare l'elenco di pizze dall'oggetto PizzaService
e archiviarlo in una proprietà.
Aprire Pages/PizzaList.cshtml.cs.
Aggiungere le istruzioni
using
seguenti all'inizio del file:using ContosoPizza.Models; using ContosoPizza.Services;
Queste istruzioni importano i tipi
Pizza
ePizzaService
che verranno usati nella pagina.All'interno del blocco dello spazio dei nomi
ContosoPizza.Pages
sostituire l'intera classePizzaListModel
con il codice seguente: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(); } }
Nel codice precedente:
- Viene creato un oggetto
PizzaService
privato di sola lettura denominato_service
. Questa variabile conterrà un riferimento a un oggettoPizzaService
.- La parola chiave
readonly
indica che il valore della variabile_service
non può essere modificato dopo che è stato impostato nel costruttore.
- La parola chiave
- Viene definita una proprietà
PizzaList
per contenere l'elenco delle pizze.- Il tipo
IList<Pizza>
indica che la proprietàPizzaList
conterrà un elenco di oggettiPizza
. PizzaList
viene inizializzato condefault!
per indicare al compilatore che verrà inizializzato in un secondo momento, quindi non sono necessari controlli di sicurezza Null.
- Il tipo
- Il costruttore accetta un oggetto
PizzaService
.- L'oggetto
PizzaService
viene fornito dall'inserimento delle dipendenze.
- L'oggetto
- Viene definito un metodo
OnGet
per recuperare l'elenco di pizze dall'oggettoPizzaService
e archiviarlo nella proprietàPizzaList
.
Suggerimento
Per informazioni sulla sicurezza dei valori Null, vedere Sicurezza dei valori Null in C#.
- Viene creato un oggetto
Salvare il file. Se si usa GitHub Codespaces, il file viene salvato automaticamente.
Tornare al terminale che esegue
dotnet watch
e premere CTRL+R per ricaricare l'app con il servizio registrato e il nuovo costruttore perPizzaListModel
.
Visualizzare l'elenco delle pizze
Ora che la pagina ha accesso all'elenco delle pizze, si userà tale elenco per visualizzare le pizze nella pagina.
Aprire Pages/PizzaList.cshtml.
Sostituire il commento
<!-- List of pizzas will go here -->
con il codice seguente:<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>
Nel codice precedente:
- Viene creato un elemento
<table>
per visualizzare l'elenco delle pizze. - Viene creato un elemento
<thead>
per contenere l'intestazione della tabella. - L'istruzione
@foreach
all'interno dell'oggetto<tbody>
scorre l'elenco delle pizze.- La proprietà
Model
fa riferimento all'oggettoPizzaListModel
creato nel file code-behind. - La proprietà
PizzaList
fa riferimento alla proprietàPizzaList
definita nel file code-behind.
- La proprietà
- Ogni iterazione dell'istruzione
@foreach
crea un elemento<tr>
per contenere i dati della pizza:- La sintassi Razor viene usata per visualizzare i dati della pizza negli elementi
<td>
. Questa sintassi viene usata per visualizzare le proprietà dell'oggettoPizza
archiviato nella variabilepizza
. Price
viene formattato usando l'interpolazione di stringhe C#.- Un'espressione ternaria viene usata per visualizzare il valore della proprietà
IsGlutenFree
come "✔️" o una cella vuota. - Viene creato un modulo per eliminare la pizza.
- L'attributo
asp-page-handler
indica che il modulo deve essere inviato al gestoreDelete
nel file code-behind. Il gestore verrà creato in un'unità successiva. - L'attributo
asp-route-id
indica che la proprietàId
dell'oggettoPizza
deve essere passata al gestoreDelete
.
- L'attributo
- La sintassi Razor viene usata per visualizzare i dati della pizza negli elementi
- Viene creato un elemento
Salvare il file. Nel browser, la pagina Pizza List viene aggiornata con l'elenco delle pizze. Se si usa GitHub Codespaces, il file viene salvato automaticamente, ma sarà necessario aggiornare manualmente la scheda del browser.
Ottimo lavoro! È stata creata una pagina Razor che visualizza un elenco di pizze. Nell'unità successiva verranno illustrati gli helper per i tag e i gestori di pagine.