Ć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 watchpolecenie, 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 PagesPoprzednie polecenie:
- Tworzy te dwa pliki w
ContosoPizza.Pagesprzestrzeni nazw:- PizzaList.cshtml — strona Razor
-
PizzaList.cshtml.cs — towarzyszącej
PageModelklasie
- 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
PizzaServicekontenerze wstrzykiwania zależności. MetodaAddScopedwskazuje, że dla każdego żądania HTTP należy utworzyć nowyPizzaServiceobiekt. Teraz można wstrzyknąć elementPizzaServicedo 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
usinginstrukcje na początku pliku:using ContosoPizza.Models; using ContosoPizza.Services;Te instrukcje importuje
Pizzatypy iPizzaService, których będziesz używać na stronie.ContosoPizza.PagesW bloku przestrzeni nazw zastąp całąPizzaListModelklasę 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
PizzaServicenazwa_serviceodczytu. Ta zmienna będzie przechowywać odwołanie doPizzaServiceobiektu.- Słowo
readonlykluczowe wskazuje, że nie można zmienić wartości_servicezmiennej po jej ustawieniu w konstruktorze.
- Słowo
- Właściwość
PizzaListjest definiowana do przechowywania listy pizz.- Typ
IList<Pizza>wskazuje, żePizzaListwłaściwość będzie przechowywać listęPizzaobiektów. -
PizzaListJest 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
PizzaServiceobiekt.- Obiekt
PizzaServicejest dostarczany przez wstrzyknięcie zależności.
- Obiekt
- Metoda jest definiowana
OnGetw celu pobrania listy pizz zPizzaServiceobiektu i zapisania jej wePizzaListwł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 watchi 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
@foreachwewnątrz<tbody>iteruje listę pizz.- Właściwość
Modelodwołuje się doPizzaListModelobiektu, który został utworzony w pliku za kodem. - Właściwość
PizzaListodwołuje się doPizzaListwłaściwości zdefiniowanej w pliku za kodem.
- Właściwość
- Każda iteracja instrukcji
@foreachtworzy<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ściPizzaobiektu przechowywanego w zmiennejpizza. -
Pricejest formatowany przy użyciu interpolacji ciągów języka C#. - Wyrażenieternary służy do wyświetlania wartości
IsGlutenFreewłaściwości jako "✔️" lub pustej komórki. - Formularz jest tworzony w celu usunięcia pizzy.
- Atrybut
asp-page-handlerwskazuje, że formularz powinien zostać przesłany doDeleteprogramu obsługi w pliku za pomocą kodu. Ta procedura obsługi zostanie utworzona w kolejnej lekcji. - Atrybut
asp-route-idwskazuje, żeIdwłaściwośćPizzaobiektu powinna zostać przekazana doDeleteprogramu 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.