Ćwiczenie — dodawanie nowej strony Razor
W poprzedniej lekcji uzyskano kod źródłowy projektu Contoso Pizza, a następnie wprowadzono pewne proste zmiany na stronie głównej. W tej lekcji dodasz nową stronę Razor do projektu.
Tworzenie strony Lista pizzy
Aby utworzyć nową stronę Razor, użyjesz interfejsu wiersza polecenia platformy .NET.
Ponieważ terminal jest blokowany przez
dotnet watch
polecenie, otwórz kolejny terminal, klikając prawym przyciskiem myszy folder ContosoPizza w Eksploratorze i wybierz polecenie Otwórz w zintegrowanym terminalu.W nowym oknie terminalu wprowadź następujące polecenie:
dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output Pages
Poprzednie polecenie:
- Tworzy te dwa pliki w
ContosoPizza.Pages
przestrzeni nazw:- PizzaList.cshtml — strona Razor
- PizzaList.cshtml.cs — towarzyszącej
PageModel
klasie
- Przechowuje oba pliki w podkatalogu Pages projektu.
- Tworzy te dwa pliki w
W pliku Pages/PizzaList.cshtml dodaj następujący kod wewnątrz
@{ }
bloku kodu:ViewData["Title"] = "Pizza List 🍕";
Spowoduje to ustawienie
<title>
elementu dla strony.Na końcu pliku dodaj następujący kod:
<h1>Pizza List 🍕</h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here -->
Spowoduje to dodanie nagłówka do strony, a także dwóch symboli zastępczych komentarza HTML dla funkcji, które zostaną dodane później.
Zapisz plik. Jeśli używasz usługi GitHub Codespaces, plik jest zapisywany automatycznie.
Wróć do terminalu z systemem
dotnet watch
, a następnie wybierz Ctrl+R , aby ponownie załadować aplikację i wykryć nowe pliki.
Dodawanie strony Lista pizzy do menu nawigacyjnego
Jest to dobry moment na przetestowanie strony, ale nie można uzyskać dostępu do strony w przeglądarce, ponieważ nie jest jeszcze połączona w menu nawigacji. Połączysz go teraz.
Otwórz plik Pages/Shared/_Layout.cshtml.
W elemecie
<ul>
z klasąnavbar-nav
(rozpoczyna się w wierszu 21) zanotuj<li>
elementy zawierające linki do stron strona główna i prywatność . Dodaj następujący kod na końcu listy po<li>
elemecie zawierającym link Prywatność :<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List 🍕</a> </li>
Spowoduje to dodanie linku do strony PizzaList z menu nawigacji.
Zapisz plik. Karta przeglądarki z aplikacją zostanie automatycznie odświeżona, aby wyświetlić zmiany. Jeśli używasz usługi GitHub Codespaces, plik jest zapisywany automatycznie, ale musisz ręcznie odświeżyć kartę przeglądarki.
Wybierz link Lista 🍕 pizzy w menu nawigacji. Zostanie wyświetlona strona Lista pizzy.
Rejestrowanie klasy PizzaService za pomocą kontenera wstrzykiwania zależności
Strona Lista pizzy PizzaService
zależy od obiektu w celu pobrania listy pizzy. Użyjesz iniekcji zależności, aby przekazać PizzaService
obiekt do strony. Najpierw zarejestruj klasę w PizzaService
kontenerze.
Otwórz plik Program.cs.
W sekcji, która dodaje usługi do kontenera, dodaj następujący kod:
builder.Services.AddScoped<PizzaService>();
Ten kod rejestruje klasę w
PizzaService
kontenerze wstrzykiwania zależności. MetodaAddScoped
wskazuje, że dla każdego żądania HTTP należy utworzyć nowyPizzaService
obiekt. Teraz można wstrzyknąć elementPizzaService
do dowolnej strony Razor.Zapisz plik. Jeśli używasz usługi GitHub Codespaces, plik jest zapisywany automatycznie.
Wyświetlanie listy pizz
Zmodyfikujmy klasę PageModel
na stronie Lista pizzy, aby pobrać listę pizz z PizzaService
obiektu i zapisać ją we właściwości .
Otwórz stronę/PizzaList.cshtml.cs.
Dodaj następujące
using
instrukcje na początku pliku:using ContosoPizza.Models; using ContosoPizza.Services;
Te instrukcje importuje
Pizza
typy iPizzaService
, których będziesz używać na stronie.ContosoPizza.Pages
W bloku przestrzeni nazw zastąp całąPizzaListModel
klasę następującym kodem: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(); } }
Powyższy kod:
- Zostanie utworzona prywatna
PizzaService
nazwa_service
odczytu. Ta zmienna będzie przechowywać odwołanie doPizzaService
obiektu.- Słowo
readonly
kluczowe wskazuje, że nie można zmienić wartości_service
zmiennej po jej ustawieniu w konstruktorze.
- Słowo
- Właściwość
PizzaList
jest definiowana do przechowywania listy pizz.- Typ
IList<Pizza>
wskazuje, żePizzaList
właściwość będzie przechowywać listęPizza
obiektów. PizzaList
Jest inicjowany w celudefault!
wskazania kompilatorowi, że zostanie on zainicjowany później, więc kontrole bezpieczeństwa o wartości null nie są wymagane.
- Typ
- Konstruktor akceptuje
PizzaService
obiekt.- Obiekt
PizzaService
jest dostarczany przez wstrzyknięcie zależności.
- Obiekt
- Metoda jest definiowana
OnGet
w celu pobrania listy pizz zPizzaService
obiektu i zapisania jej wePizzaList
właściwości .
Napiwek
Jeśli potrzebujesz pomocy w zrozumieniu bezpieczeństwa wartości null, zobacz Bezpieczeństwo wartości null w języku C#.
- Zostanie utworzona prywatna
Zapisz plik. Jeśli używasz usługi GitHub Codespaces, plik jest zapisywany automatycznie.
Wróć do terminalu uruchomionego
dotnet watch
i naciśnij Ctrl+R , aby ponownie załadować aplikację za pomocą zarejestrowanej usługi i nowego konstruktora dla poleceniaPizzaListModel
.
Wyświetlanie listy pizz
Teraz, gdy strona ma dostęp do listy pizz, użyjesz tej listy, aby wyświetlić pizze na stronie.
Otwórz plik Pages/PizzaList.cshtml.
Zastąp komentarz
<!-- List of pizzas will go here -->
następującym kodem:<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>
Powyższy kod:
- Zostanie
<table>
utworzony element umożliwiający wyświetlenie listy pizz. - Tworzony
<thead>
jest element do przechowywania nagłówka tabeli. - Instrukcja
@foreach
wewnątrz<tbody>
iteruje listę pizz.- Właściwość
Model
odwołuje się doPizzaListModel
obiektu, który został utworzony w pliku za kodem. - Właściwość
PizzaList
odwołuje się doPizzaList
właściwości zdefiniowanej w pliku za kodem.
- Właściwość
- Każda iteracja instrukcji
@foreach
tworzy<tr>
element do przechowywania danych pizzy:- Składnia Razor służy do wyświetlania danych pizzy w elementach
<td>
. Ta składnia służy do wyświetlania właściwościPizza
obiektu przechowywanego w zmiennejpizza
. Price
jest formatowany przy użyciu interpolacji ciągów języka C#.- Wyrażenieternary służy do wyświetlania wartości
IsGlutenFree
właściwości jako "✔️" lub pustej komórki. - Formularz jest tworzony w celu usunięcia pizzy.
- Atrybut
asp-page-handler
wskazuje, że formularz powinien zostać przesłany doDelete
programu obsługi w pliku za pomocą kodu. Ta procedura obsługi zostanie utworzona w kolejnej lekcji. - Atrybut
asp-route-id
wskazuje, żeId
właściwośćPizza
obiektu powinna zostać przekazana doDelete
programu obsługi.
- Atrybut
- Składnia Razor służy do wyświetlania danych pizzy w elementach
- Zostanie
Zapisz plik. W przeglądarce strona Lista pizzy odświeża się z listą pizzy. Jeśli używasz usługi GitHub Codespaces, plik jest zapisywany automatycznie, ale musisz ręcznie odświeżyć kartę przeglądarki.
Dobrze! Utworzono stronę Razor zawierającą listę pizz. W następnej lekcji dowiesz się więcej o pomocnikach tagów i programach obsługi stron.