Latihan - Menambahkan Halaman Razor baru
Di unit sebelumnya, Anda mendapatkan kode sumber untuk proyek Contoso Pizza, dan kemudian Anda membuat beberapa perubahan sederhana pada halaman beranda. Di unit ini, Anda akan menambahkan halaman Razor baru ke proyek.
Buat halaman Daftar Pizza
Untuk membuat halaman Razor baru, Anda akan menggunakan .NET CLI.
Karena terminal diblokir oleh
dotnet watchperintah, buka terminal lain dengan mengklik kanan folder ContosoPizza di Explorer dan pilih Buka di Terminal Terintegrasi.Di jendela terminal baru, masukkan perintah berikut:
dotnet new page --name PizzaList --namespace ContosoPizza.Pages --output PagesPerintah sebelumnya:
- Membuat dua file ini di
ContosoPizza.Pagesnamespace:- PizzaList.cshtml - halaman Razor
-
PizzaList.cshtml.cs - kelas yang menyertainya
PageModel
- Menyimpan kedua file di subdirektori Halaman proyek.
- Membuat dua file ini di
Di Pages/PizzaList.cshtml, tambahkan kode berikut di dalam
@{ }blok kode:ViewData["Title"] = "Pizza List 🍕";Ini mengatur
<title>elemen untuk halaman.Di akhir file, tambahkan kode berikut ke ujung file:
<h1>Pizza List 🍕</h1> <!-- New Pizza form will go here --> <!-- List of pizzas will go here -->Ini menambahkan judul ke halaman, serta dua tempat penampung komentar HTML untuk fungsionalitas yang akan Anda tambahkan nanti.
Simpan berkas. Jika Anda menggunakan GitHub Codespaces, file akan disimpan secara otomatis.
Kembali ke terminal yang menjalankan
dotnet watch, dan pilih Ctrl+R untuk memuat ulang aplikasi dan mendeteksi file baru.
Menambahkan halaman Daftar Pizza ke menu navigasi
Ini akan menjadi waktu yang tepat untuk menguji halaman, tetapi halaman tidak dapat dijangkau di browser karena belum ditautkan di menu navigasi. Anda akan menautkannya sekarang.
Buka Pages/Shared/_Layout.cshtml.
<ul>Dalam elemen dengannavbar-navkelas (dimulai pada baris 21), perhatikan<li>elemen yang berisi tautan ke halaman Beranda dan Privasi. Tambahkan kode berikut ke akhir daftar, setelah<li>elemen yang berisi tautan Privasi :<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/PizzaList">Pizza List 🍕</a> </li>Ini menambahkan tautan ke halaman PizzaList ke menu navigasi.
Simpan berkas. Tab browser dengan aplikasi secara otomatis di-refresh untuk menampilkan perubahan. Jika Anda menggunakan GitHub Codespaces, file akan disimpan secara otomatis, tetapi Anda harus me-refresh tab browser secara manual.
Pilih tautan Daftar Pizza 🍕 di menu navigasi. Halaman Daftar Pizza muncul.
Daftarkan kelas PizzaService dengan kontainer injeksi dependensi
Halaman Daftar Pizza bergantung pada objek PizzaService untuk mengambil daftar pizza. Anda akan menggunakan injeksi dependensi untuk menyediakan objek PizzaService ke halaman. Pertama, daftarkan PizzaService class dengan kontainer.
Buka Program.cs.
Di bagian yang menambahkan layanan ke kontainer, tambahkan kode berikut:
builder.Services.AddScoped<PizzaService>();Kode ini mendaftarkan
PizzaServicekelas dengan kontainer injeksi dependensi. Metode iniAddScopedmenunjukkan bahwa objek baruPizzaServiceharus dibuat untuk setiap permintaan HTTP.PizzaServiceSekarang dapat disuntikkan ke halaman Razor mana pun.Simpan berkas. Jika Anda menggunakan GitHub Codespaces, file akan disimpan secara otomatis.
Menampilkan daftar pizza
Mari kita ubah PageModel kelas untuk halaman Daftar Pizza untuk mengambil daftar pizza dari PizzaService objek dan menyimpannya di properti.
Buka Halaman/PizzaList.cshtml.cs.
Tambahkan pernyataan berikut
usingke bagian atas file:using ContosoPizza.Models; using ContosoPizza.Services;Pernyataan ini mengimpor jenis
PizzadanPizzaServiceyang akan Anda gunakan di halaman.Di dalam blok namespace
ContosoPizza.Pages, ganti seluruh kelasPizzaListModeldengan kode berikut: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(); } }Dalam kode sebelumnya:
- Sebuah
PizzaServiceprivat readonly yang bernama_servicetelah dibuat. Variabel ini akan menyimpan referensi kePizzaServiceobjek.- Kata
readonlykunci menunjukkan bahwa nilai_servicevariabel tidak dapat diubah setelah diatur dalam konstruktor.
- Kata
- Properti
PizzaListdidefinisikan untuk menyimpan daftar pizza.- Jenis
IList<Pizza>menunjukkan bahwa propertiPizzaListakan menyimpan objek daftarPizza. -
PizzaListdiinisialisasi untukdefault!menunjukkan kepada pengkompilasi bahwa itu akan diinisialisasi nanti, sehingga pemeriksaan keamanan null tidak diperlukan.
- Jenis
- Konstruktor menerima
PizzaServiceobjek.- Objek
PizzaServicedisediakan oleh injeksi dependensi.
- Objek
- Metode
OnGetdidefinisikan untuk mengambil daftar pizza dariPizzaServiceobjek dan menyimpannya diPizzaListproperti .
Tips
Jika Anda memerlukan bantuan untuk memahami keamanan null, lihat Keamanan null di C#.
- Sebuah
Simpan berkas. Jika Anda menggunakan GitHub Codespaces, file akan disimpan secara otomatis.
Kembali ke terminal yang berjalan
dotnet watchdan tekan Ctrl+R untuk memuat ulang aplikasi dengan layanan terdaftar dan konstruktor baru untukPizzaListModel.
Menampilkan daftar pizza
Sekarang setelah halaman memiliki akses ke daftar pizza, Anda akan menggunakan daftar itu untuk menampilkan pizza di halaman.
Buka Pages/PizzaList.cshtml.
Ganti komentar
<!-- List of pizzas will go here -->dengan kode berikut:<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>Dalam kode sebelumnya:
- Elemen
<table>dibuat untuk menampilkan daftar pizza. - Elemen
<thead>dibuat untuk menahan header tabel. - Pernyataan
@foreachdi dalam<tbody>melewati daftar pizza.- Properti
Modelmengacu pada objekPizzaListModelyang dibuat dalam file code-behind. - Properti
PizzaListmengacu padaPizzaListyang ditentukan dalam file code-behind.
- Properti
- Setiap iterasi
@foreachpernyataan membuat<tr>elemen untuk menyimpan data pizza:- Sintaks razor digunakan untuk menampilkan data pizza dalam elemen
<td>. Sintaks ini digunakan untuk menampilkan propertiPizzaobjek yang disimpan dalampizzavariabel. -
Pricediformat menggunakan interpolasi string C#. - Ekspresi terner digunakan untuk menampilkan nilai
IsGlutenFreeproperti sebagai "✔️" atau sel kosong. - Formulir dibuat untuk menghapus pizza.
- Atribut
asp-page-handlermenunjukkan bahwa formulir harus dikirimkan keDeletehandler dalam file code-behind. Anda akan membuat handler tersebut di unit selanjutnya. - Atribut
asp-route-idmenunjukkan bahwaIdpropertiPizzaobjek harus diteruskan keDeletehandler.
- Atribut
- Sintaks razor digunakan untuk menampilkan data pizza dalam elemen
- Elemen
Simpan berkas. Di peramban, halaman Daftar Pizza diperbarui dengan daftar pizza. Jika Anda menggunakan GitHub Codespaces, file akan disimpan secara otomatis, tetapi Anda harus me-refresh tab browser secara manual.
Kerja bagus! Anda telah membuat halaman Razor yang menampilkan daftar pizza. Di unit berikutnya, Anda akan mempelajari tentang tag helper dan page handler.