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
dotnet watchcomando, 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 PagesIl comando precedente:
- Crea questi due file nello spazio dei nomi
ContosoPizza.Pages:- PizzaList.cshtml - la pagina di Razor
- PizzaList.cshtml.cs : classe associata
PageModel
- 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 watche 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 lanavbar-navclasse (inizia alla riga 21), annotare gli<li>elementi che contengono i collegamenti alle pagine Home e Privacy . Aggiungere il codice seguente alla fine dell'elenco, dopo l'elemento contenente il<li>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 al 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 è necessario aggiornare manualmente la scheda del browser.
Selezionare il collegamento Elenco Pizza 🍕 nel menu di navigazione. 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
PizzaServicecon il contenitore di inserimento delle dipendenze. Il metodoAddScopedindica che deve essere creato un nuovo oggettoPizzaServiceper ogni richiesta HTTP. Ora l'oggettoPizzaServicepuò 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
usingseguenti all'inizio del file:using ContosoPizza.Models; using ContosoPizza.Services;Queste istruzioni importano i tipi
PizzaePizzaServiceche verranno usati nella pagina.All'interno del blocco dello spazio dei nomi
ContosoPizza.Pagessostituire l'intera classePizzaListModelcon 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
PizzaServiceprivato di sola lettura denominato_service. Questa variabile conterrà un riferimento a un oggettoPizzaService.- La parola chiave
readonlyindica che il valore della variabile_servicenon può essere modificato dopo che è stato impostato nel costruttore.
- La parola chiave
- Viene definita una proprietà
PizzaListper contenere l'elenco delle pizze.- Il tipo
IList<Pizza>indica che la proprietàPizzaListconterrà un elenco di oggettiPizza. PizzaListviene 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
PizzaServiceviene fornito dall'inserimento delle dipendenze.
- L'oggetto
- Viene definito un metodo
OnGetper recuperare l'elenco di pizze dall'oggettoPizzaServicee archiviarlo nella proprietàPizzaList.
Suggerimento
Per informazioni sulla sicurezza dei valori Null, vedere Sicurezza 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 watche 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
@foreachall'interno dell'oggetto<tbody>scorre l'elenco delle pizze.- La proprietà
Modelfa riferimento all'oggettoPizzaListModelcreato nel file code-behind. - La proprietà
PizzaListfa riferimento alla proprietàPizzaListdefinita nel file code-behind.
- La proprietà
- Ogni iterazione dell'istruzione
@foreachcrea 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'oggettoPizzaarchiviato nella variabilepizza. Priceviene formattato usando l'interpolazione di stringhe C#.- Un'espressione ternaria viene usata per visualizzare il valore della proprietà
IsGlutenFreecome "✔️" o una cella vuota. - Viene creato un modulo per eliminare la pizza.
- L'attributo
asp-page-handlerindica che il modulo deve essere inviato al gestoreDeletenel file code-behind. Il gestore verrà creato in un'unità successiva. - L'attributo
asp-route-idindica che la proprietàIddell'oggettoPizzadeve 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 è 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.