Övning – Lägga till en ny Razor-sida
I föregående lektion hämtade du källkoden för Contoso Pizza-projektet och sedan gjorde du några enkla ändringar på startsidan. I den här lektionen lägger du till en ny Razor-sida i projektet.
Skapa sidan Pizzalista
Om du vill skapa en ny Razor-sida använder du .NET CLI.
Eftersom terminalen blockeras av
dotnet watchkommandot öppnar du en annan terminal genom att högerklicka på mappen ContosoPizza i Utforskaren och välja Öppna i integrerad terminal.I det nya terminalfönstret anger du följande kommando:
dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output PagesKommandot ovan:
- Skapar dessa två filer i
ContosoPizza.Pagesnamnområdet:- PizzaList.cshtml – Razor-sidan
-
PizzaList.cshtml.cs – den medföljande
PageModelklassen
- Lagrar båda filerna i projektets underkatalog Pages .
- Skapar dessa två filer i
Lägg :
ViewData["Title"] = "Pizza List 🍕";Detta anger elementet
<title>för sidan.Lägg till följande kod i slutet av filen:
<h1>Pizza List 🍕</h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here -->Detta lägger till en rubrik på sidan, samt två HTML-kommentarsplatshållare för funktioner som du lägger till senare.
Spara filen. Om du använder GitHub Codespaces sparas filen automatiskt.
Gå tillbaka till terminalen som kör
dotnet watchoch välj Ctrl+R för att läsa in appen igen och identifiera de nya filerna.
Lägg till sidan Pizzalista i navigeringsmenyn
Det skulle vara ett bra tillfälle att testa sidan, men sidan kan inte nås i webbläsaren eftersom den ännu inte är länkad i navigeringsmenyn. Du länkar den nu.
Öppna Sidor/Delad/_Layout.cshtml.
I -elementet med klassen (börjar på rad 21) noterar du de
<ul>element som innehåller länkarnanavbar-navoch<li>. Lägg till följande kod i slutet av listan efter elementet<li>som innehåller sekretesslänken:<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List 🍕</a> </li>Detta lägger till en länk till sidan PizzaList i navigeringsmenyn.
Spara filen. Webbläsarfliken med appen uppdateras automatiskt för att visa ändringarna. Om du använder GitHub Codespaces sparas filen automatiskt, men du måste uppdatera webbläsarfliken manuellt.
Välj länken Pizzalista 🍕 i navigeringsmenyn. Sidan Pizzalista visas.
Registrera Klassen PizzaService med containern för beroendeinmatning
Sidan Pizzalista beror på objektet PizzaService för att hämta listan över pizzor. Du använder beroendeinmatning för att ange PizzaService objektet på sidan.
PizzaService Registrera först klassen med containern.
Öppna Program.cs.
I avsnittet som lägger till tjänster i containern lägger du till följande kod:
builder.Services.AddScoped<PizzaService>();Den här koden registrerar
PizzaServiceklassen med containern för beroendeinmatning. MetodenAddScopedanger att ett nyttPizzaServiceobjekt ska skapas för varje HTTP-begäran.PizzaServiceNu kan matas in i valfri Razor-sida.Spara filen. Om du använder GitHub Codespaces sparas filen automatiskt.
Visa en lista över pizzor
Nu ska vi ändra PageModel klassen för sidan Pizzalista för att hämta listan över pizzor från PizzaService objektet och lagra den i en egenskap.
Öppna Pages/PizzaList.cshtml.cs.
Lägg till följande
usinginstruktioner överst i filen:using ContosoPizza.Models; using ContosoPizza.Services;Dessa instruktioner importerar de
Pizzatyper ochPizzaServicesom du ska använda på sidan.I namnområdesblocket
ContosoPizza.Pagesersätter du helaPizzaListModelklassen med följande kod: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(); } }I koden ovan:
- Ett privat skrivskyddat
PizzaServicenamn_serviceskapas. Den här variabeln innehåller en referens till ettPizzaServiceobjekt.- Nyckelordet
readonlyanger att värdet för variabeln_serviceinte kan ändras när det har angetts i konstruktorn.
- Nyckelordet
- En
PizzaListegenskap definieras för att lagra listan över pizzor.- Typen
IList<Pizza>anger att egenskapenPizzaListinnehåller en lista överPizzaobjekt. -
PizzaListinitieras för attdefault!indikera för kompilatorn att den kommer att initieras senare, så null-säkerhetskontroller krävs inte.
- Typen
- Konstruktorn accepterar ett
PizzaServiceobjekt.- Objektet
PizzaServicetillhandahålls genom beroendeinmatning.
- Objektet
- En
OnGetmetod definieras för att hämta listan över pizzor frånPizzaServiceobjektet och lagra den i egenskapenPizzaList.
Dricks
Om du behöver hjälp med att förstå nullsäkerhet kan du läsa Null-säkerhet i C#.
- Ett privat skrivskyddat
Spara filen. Om du använder GitHub Codespaces sparas filen automatiskt.
Gå tillbaka till terminalen där
dotnet watchkör och tryck på Ctrl + R för att ladda om appen med den redan registrerade tjänsten och den nya konstruktorn förPizzaListModel.
Visa listan över pizzor
Nu när sidan har åtkomst till listan över pizzor använder du den listan för att visa pizzorna på sidan.
Öppna sidor/PizzaList.cshtml.
Ersätt kommentaren
<!-- List of pizzas will go here -->med följande kod:<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>I koden ovan:
- Ett
<table>element skapas för att visa listan över pizzor. - Ett
<thead>element skapas för att lagra tabellrubriken. - Uttalandet
@foreachinuti<tbody>itererar över listan över pizzor.- Egenskapen
Modelrefererar till objektetPizzaListModelsom skapades i filen bakom koden. - Egenskapen
PizzaListrefererar till egenskapenPizzaListsom definierades i filen code-behind.
- Egenskapen
- Varje iteration av -instruktionen
@foreachskapar ett<tr>element för att lagra pizzadata:- Razor-syntax används för att visa pizzadata i elementen
<td>. Den här syntaxen används för att visa egenskaperna för objektetPizzasom lagras i variabelnpizza. -
Priceformateras med C#-stränginterpolation. - Ett ternary-uttryck används för att visa värdet för
IsGlutenFreeegenskapen som "✔️" eller en tom cell. - Ett formulär skapas för att ta bort pizzan.
- Attributet
asp-page-handleranger att formuläret ska skickas tillDeletehanteraren i filen bakom koden. Du skapar den hanteraren i en senare lektion. - Attributet
asp-route-idanger attIdobjektetsPizzaegenskap ska skickas tillDeletehanteraren.
- Attributet
- Razor-syntax används för att visa pizzadata i elementen
- Ett
Spara filen. I webbläsaren uppdateras sidan Pizzalista med listan över pizzor. Om du använder GitHub Codespaces sparas filen automatiskt, men du måste uppdatera webbläsarfliken manuellt.
Snyggt jobbat! Du har skapat en Razor-sida som visar en lista med pizzor. I nästa lektion får du lära dig om tagghjälpare och sidhanterare.