Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi artikel ini untuk .NET 9.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi lebih lanjut, lihat Kebijakan Dukungan .NET dan .NET Core . Untuk rilis saat ini, lihat versi artikel ini untuk .NET 9.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin akan dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, baik secara tegas maupun tersirat, sehubungan dengan informasi yang disediakan di sini.
Untuk rilis saat ini, lihat versi artikel ini untuk .NET 9.
Komponen Razor dapat diintegrasikan ke dalam Halaman Razor atau aplikasi MVC. Ketika halaman atau tampilan dirender, komponen dapat diprerender pada saat yang sama.
Penting
Perubahan kerangka kerja di berbagai rilis ASP.NET Core menyebabkan munculnya set instruksi yang berbeda dalam artikel ini. Sebelum menggunakan panduan dari artikel ini, pastikan pemilih versi dokumen di bagian atas artikel ini cocok dengan versi ASP.NET Core yang ingin Anda gunakan untuk aplikasi Anda.
Prerendering dapat meningkatkan Search Engine Optimization (SEO) dengan merender konten untuk respons HTTP awal yang dapat digunakan mesin pencari untuk menghitung peringkat halaman.
Setelah mengonfigurasi proyek, gunakan panduan di bagian berikutnya sesuai dengan persyaratan proyek.
- Untuk komponen yang dapat diarahkan langsung dari permintaan pengguna. Ikuti panduan ini ketika pengunjung harus dapat membuat permintaan HTTP di browser mereka untuk sebuah komponen dengan direktif
@page
. - Untuk komponen yang tidak dapat dirutekan langsung dari permintaan pengguna, lihat bagian Render komponen dari halaman atau tampilan. Ikuti panduan ini ketika aplikasi menyematkan komponen ke dalam halaman atau tampilan yang ada dengan Component Tag Helper.
Konfigurasi
Gunakan panduan berikut untuk mengintegrasikan komponen Razor ke dalam halaman atau tampilan dari aplikasi Razor Pages atau MVC yang sudah ada.
Tambahkan berkas impor ke folder root proyek dengan isi berikutnya. Ubah placeholder
{APP NAMESPACE}
menjadi namespace proyek._Imports.razor
:@using System.Net.Http @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using {APP NAMESPACE}
Dalam berkas tata letak proyek (
Pages/Shared/_Layout.cshtml
di aplikasi Razor Pages atauViews/Shared/_Layout.cshtml
di aplikasi MVC):Tambahkan tag
<base>
berikut dan komponen Tag Helper HeadOutlet ke dalam elemen<head>
.<base href="~/" /> <component type="typeof(Microsoft.AspNetCore.Components.Web.HeadOutlet)" render-mode="ServerPrerendered" />
Nilai
href
( jalur dasar aplikasi) dalam contoh sebelumnya mengasumsikan bahwa aplikasi berada di jalur URL akar (/
). Jika aplikasi adalah sub-aplikasi, lihat ASP.NET Core Blazor jalur dasar aplikasi.Komponen HeadOutlet digunakan untuk merender konten head (
<head>
) untuk judul halaman (komponen PageTitle) dan elemen head lainnya (komponen HeadContent) yang diatur oleh komponen-komponen Razor. Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.Tambahkan tag
<script>
untuk skripblazor.server.js
segera sebelum bagian renderScripts
(@await RenderSectionAsync(...)
).<script src="_framework/blazor.server.js"></script>
Kerangka kerja menambahkan skrip
blazor.server.js
ke dalam aplikasi. Tidak perlu menambahkan file skripblazor.server.js
secara manual ke aplikasi.
Catatan
Biasanya, layout dimuat melalui file
_ViewStart.cshtml
.Daftarkan layanan Blazor Server di
Program.cs
di mana layanan didaftarkan.builder.Services.AddServerSideBlazor();
Tambahkan titik akhir Blazor Hub ke titik akhir
Program.cs
di mana rute dipetakan. Tempatkan baris berikut setelah pemanggilan keMapRazorPages
(Razor Pages) atauMapControllerRoute
(MVC):app.MapBlazorHub();
Integrasikan komponen ke dalam halaman atau tampilan apa pun. Sebagai contoh, tambahkan komponen
Counter
ke folderShared
proyek tersebut.Pages/Shared/Counter.razor
(Razor Halaman) atauViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Halaman:
Di halaman
Index
proyek dari aplikasi Pages Razor, tambahkan namespace komponenCounter
dan tanamkan komponen tersebut ke dalam halaman. Ketika halamanIndex
dimuat, komponenCounter
dirender sebelumnya di dalam halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
MVC:
Dalam tampilan proyek aplikasi MVC, tambahkan namespace komponen dan sematkan komponen ke dalam tampilan. Ketika tampilan
Index
dimuat, komponenCounter
dirender sebelumnya di halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
Untuk informasi lebih lanjut, lihat bagian Render components from a page or view.
Gunakan komponen yang dapat diarahkan dalam aplikasi Pages
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat dirutekan di aplikasi Halaman Razor
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Tambahkan halaman
_Host
ke proyek dengan konten berikut. Ganti placeholder{APP NAMESPACE}
dengan namespace aplikasi.Pages/_Host.cshtml
:@page @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <component type="typeof(App)" render-mode="ServerPrerendered" />
Catatan
Contoh sebelumnya mengasumsikan bahwa komponen HeadOutlet dan skrip Blazor (
_framework/blazor.server.js
) dirender oleh tata letak aplikasi. Untuk informasi lebih lanjut, lihat bagian Configuration.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Pada
Program.cs
titik akhir, tambahkan rute prioritas rendah untuk halaman_Host
sebagai titik akhir terakhir.app.MapFallbackToPage("/_Host");
Tambahkan komponen berjalur ke dalam proyek. Contoh berikut adalah komponen
RoutableCounter
yang didasarkan pada komponenCounter
dalam template proyek Blazor.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Gunakan komponen yang dapat di-routing dalam aplikasi MVC
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat diarahkan dalam aplikasi MVC:
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Tambahkan tampilan
_Host
ke proyek dengan konten berikut. Ganti placeholder{APP NAMESPACE}
dengan namespace aplikasi.Views/Home/_Host.cshtml
:@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <component type="typeof(App)" render-mode="ServerPrerendered" />
Catatan
Contoh sebelumnya mengasumsikan bahwa komponen HeadOutlet dan skrip Blazor (
_framework/blazor.server.js
) dirender oleh tata letak aplikasi. Untuk informasi lebih lanjut, lihat bagian Configuration.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Tambahkan tindakan ke pengontrol Home.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Pada endpoint
Program.cs
, tambahkan rute prioritas rendah untuk aksi kontroler yang mengembalikan tampilan_Host
.app.MapFallbackToController("Blazor", "Home");
Buat folder
Pages
dalam aplikasi MVC dan tambahkan komponen-komponen yang dapat diarahkan. Contoh berikut adalah komponenRoutableCounter
yang didasarkan pada komponenCounter
dalam template proyek Blazor.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Render komponen dari halaman atau tampilan
Bagian ini berkaitan dengan menambahkan komponen ke halaman atau tampilan, di mana komponen tersebut tidak dapat langsung diarahkan dari permintaan pengguna.
Untuk merender sebuah komponen dari halaman atau tampilan, gunakan Component Tag Helper.
Render komponen interaktif yang memiliki status
Komponen interaktif berstatus dapat ditambahkan ke halaman atau tampilan Razor.
Ketika halaman atau tampilan dirender:
- Komponen dirender sebelumnya bersamaan dengan halaman atau tampilan.
- Status komponen awal yang digunakan untuk prarender telah hilang.
- Keadaan komponen baru dibuat ketika sambungan SignalR diatur.
Halaman Razor berikut merender komponen Counter
.
<h1>Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Render komponen noninteraktif
Pada halaman Razor berikut, komponen Counter
dirender secara statis dengan nilai awal yang ditentukan menggunakan sebuah formulir. Karena komponen dirender secara statis, komponen tersebut tidak interaktif.
<h1>Razor Page</h1>
<form>
<input type="number" asp-for="InitialValue" />
<button type="submit">Set initial value</button>
</form>
<component type="typeof(Counter)" render-mode="Static"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Namespace Komponen
Saat menggunakan folder kustom untuk menyimpan komponen proyek Razor, tambahkan namespace yang mewakili folder tersebut baik ke halaman/tampilan atau ke file _ViewImports.cshtml
. Pada contoh berikut:
- Komponen disimpan dalam folder
Components
proyek. - Placeholder
{APP NAMESPACE}
adalah namespace proyek.Components
mewakili nama folder.
@using {APP NAMESPACE}.Components
File _ViewImports.cshtml
terletak di folder Pages
dari aplikasi Pages Razor atau folder Views
dari aplikasi MVC.
Untuk informasi lebih lanjut, lihat komponen Razor ASP.NET Core.
Mempertahankan keadaan yang sudah diprender
Tanpa mempertahankan status yang telah dirender sebelumnya, status yang digunakan selama proses perenderan akan hilang dan harus dibuat ulang ketika aplikasi sepenuhnya dimuat. Jika ada status yang diatur secara asinkron, UI mungkin akan berkedip saat UI yang sudah dirender sebelumnya digantikan dengan placeholder sementara, dan kemudian dirender sepenuhnya lagi.
Untuk menyimpan status komponen yang telah dirender sebelumnya, gunakan Persist Component State Tag Helper (sumber referensi). Tambahkan tag dari Pembantu Tag, <persist-component-state />
, di dalam tag penutup </body>
halaman _Host
dalam aplikasi yang melakukan pra-render komponen.
Catatan
Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis berikutnya dari .NET. Untuk memilih tag untuk rilis tertentu, gunakan daftar dropdown Ganti cabang atau tag. Untuk informasi lebih lanjut, lihat How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205).
Di Pages/_Host.cshtml
dari Blazor aplikasi yang ServerPrerendered
dalam aplikasi Blazor Server:
<body>
...
<persist-component-state />
</body>
Tentukan status apa yang harus dipertahankan dengan menggunakan layanan PersistentComponentState. Atribut [SupplyParameterFromPersistentComponentState]
yang diterapkan ke sebuah properti mendaftarkan callback untuk mempertahankan status selama pra-rendering dan memuatnya saat komponen dirender secara interaktif atau layanan diinisialisasi.
Dalam contoh berikut, placeholder {TYPE}
menunjukkan jenis data yang akan disimpan (misalnya, WeatherForecast[]
).
@code {
[SupplyParameterFromPersistentComponentState]
public {TYPE} Data { get; set; }
protected override async Task OnInitializedAsync()
{
Data ??= await ...;
}
}
Dalam contoh berikut, komponen WeatherForecastPreserveState
menyimpan keadaan prakiraan cuaca selama prarender dan kemudian mengambil keadaan tersebut untuk menginisialisasi komponen. Tag Helper Persist Component State mempertahankan status komponen setelah semua pemanggilan komponen.
WeatherForecastPreserveState.razor
:
@page "/weather-forecast-preserve-state"
@using BlazorSample.Shared
@inject IWeatherForecastService WeatherForecastService
<PageTitle>Weather Forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (Forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in Forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
[SupplyParameterFromPersistentComponentState]
public WeatherForecast[]? Forecasts { get; set; }
protected override async Task OnInitializedAsync()
{
Forecasts ??= await WeatherForecastService.GetForecastAsync(
DateOnly.FromDateTime(DateTime.Now));
}
}
Tentukan status apa yang harus dipertahankan dengan menggunakan layanan PersistentComponentState. PersistentComponentState.RegisterOnPersisting mendaftarkan callback untuk mempertahankan status komponen sebelum aplikasi dihentikan sementara. Status aplikasi diambil kembali ketika aplikasi dilanjutkan. Lakukan panggilan pada akhir dari kode inisialisasi untuk menghindari potensi race condition selama pemadaman aplikasi.
Pada contoh berikut:
- Tempat penampung
{TYPE}
mewakili jenis data yang akan dipertahankan (misalnya,WeatherForecast[]
). - Placeholder
{TOKEN}
adalah string pengidentifikasi negara bagian (misalnya,fetchdata
).
@implements IDisposable
@inject PersistentComponentState ApplicationState
...
@code {
private {TYPE} data;
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (!ApplicationState.TryTakeFromJson<{TYPE}>(
"{TOKEN}", out var restored))
{
data = await ...;
}
else
{
data = restored!;
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
}
private Task PersistData()
{
ApplicationState.PersistAsJson("{TOKEN}", data);
return Task.CompletedTask;
}
void IDisposable.Dispose()
{
persistingSubscription.Dispose();
}
}
Dalam contoh berikut, komponen WeatherForecastPreserveState
menyimpan keadaan prakiraan cuaca selama prarender dan kemudian mengambil keadaan tersebut untuk menginisialisasi komponen. Tag Helper Persist Component State mempertahankan status komponen setelah semua pemanggilan komponen.
Pages/WeatherForecastPreserveState.razor
:
@page "/weather-forecast-preserve-state"
@using BlazorSample.Shared
@implements IDisposable
@inject IWeatherForecastService WeatherForecastService
@inject PersistentComponentState ApplicationState
<PageTitle>Weather Forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[] forecasts = Array.Empty<WeatherForecast>();
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (!ApplicationState.TryTakeFromJson<WeatherForecast[]>(
nameof(forecasts), out var restored))
{
forecasts =
await WeatherForecastService.GetForecastAsync(
DateOnly.FromDateTime(DateTime.Now));
}
else
{
forecasts = restored!;
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
}
private Task PersistData()
{
ApplicationState.PersistAsJson(nameof(forecasts), forecasts);
return Task.CompletedTask;
}
void IDisposable.Dispose()
{
persistingSubscription.Dispose();
}
}
Dengan menginisialisasi komponen dengan kondisi yang sama seperti yang digunakan selama pra-rendering, setiap langkah inisialisasi yang mahal hanya dieksekusi satu kali. UI yang dirender juga sesuai dengan UI yang dirender sebelumnya, sehingga tidak terjadi kedipan di browser.
Keadaan yang telah dirender sebelumnya disimpan dan ditransfer ke klien, di mana keadaan ini digunakan untuk memulihkan keadaan komponen. ASP.NET Core Data Protection menjamin bahwa data ditransfer dengan aman dalam aplikasi Blazor Server.
Ukuran status pra-render dan batas ukuran pesan SignalR
Ukuran status prerendered yang besar mungkin melebihi batas ukuran pesan sirkuit Blazor dari SignalR, yang mengakibatkan hal berikut:
- Sirkuit SignalR gagal diinisialisasi dengan kesalahan pada klien: Circuit host not initialized.
- Antarmuka pengguna untuk penyambungan ulang di klien muncul ketika sirkuit gagal berfungsi. Pemulihan tidak mungkin.
Untuk menyelesaikan masalah, gunakan salah satu dari pendekatan berikut ini.
- Kurangi jumlah data yang Anda masukkan ke dalam keadaan prapemrosesan.
- Tingkatkan batas ukuran pesanSignalR. PERINGATAN: Meningkatkan batas dapat meningkatkan risiko terjadinya serangan Denial of Service (DoS).
Sumber daya tambahan Blazor Server
- Manajemen keadaan: Menangani prerendering
-
Razor subjek siklus hidup komponen yang berhubungan dengan prapengrendaan.
-
Inisialisasi komponen (
OnInitialized{Async}
) -
Setelah render komponen (
OnAfterRender{Async}
) - Penyambungan ulang berstatus setelah prerendering
- Prarendering dengan Interop JavaScript
-
Inisialisasi komponen (
- Autentikasi dan otorisasi: Aspek umum
- Menangani Kesalahan: Prarender
- Menghosting dan menyebarkan aplikasi sisi Blazor server ASP.NET Core
- Mitigasi ancaman: Penyusupan silang situs (XSS)
-
OnNavigateAsync dieksekusi dua kali saat prerendisi: Tangani acara navigasi asinkron dengan
OnNavigateAsync
Prerendering dapat meningkatkan Search Engine Optimization (SEO) dengan merender konten untuk respons HTTP awal yang dapat digunakan mesin pencari untuk menghitung peringkat halaman.
Setelah mengonfigurasi proyek, gunakan panduan di bagian berikutnya sesuai dengan persyaratan proyek.
- Komponen yang dapat diarahkan: Untuk komponen yang dapat diarahkan langsung dari permintaan pengguna. Ikuti panduan ini ketika pengunjung harus dapat membuat permintaan HTTP di browser mereka untuk sebuah komponen dengan direktif
@page
. - Render komponen dari halaman atau tampilan: Untuk komponen yang tidak secara langsung dapat diakses dari permintaan pengguna. Ikuti panduan ini ketika aplikasi menyematkan komponen ke dalam halaman atau tampilan yang ada dengan Component Tag Helper.
Konfigurasi
Gunakan panduan berikut untuk mengintegrasikan komponen Razor ke dalam halaman atau tampilan dari aplikasi Razor Pages atau MVC yang sudah ada.
Penting
Penggunaan halaman tata letak (_Layout.cshtml
) dengan Component Tag Helper untuk komponen HeadOutlet diperlukan untuk mengontrol konten <head>
, seperti judul halaman (komponen PageTitle) dan elemen kepala lainnya (komponen HeadContent). Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.
Dalam file tata letak proyek:
Tambahkan tag
<base>
dan Tag Helper komponen HeadOutlet berikut ke elemen<head>
diPages/Shared/_Layout.cshtml
(Razor Halaman) atauViews/Shared/_Layout.cshtml
(MVC):<base href="~/" /> <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
Nilai
href
( jalur dasar aplikasi) dalam contoh sebelumnya mengasumsikan bahwa aplikasi berada di jalur URL akar (/
). Jika aplikasi adalah sub-aplikasi, lihat ASP.NET Core Blazor jalur dasar aplikasi.Komponen HeadOutlet digunakan untuk merender konten head (
<head>
) untuk judul halaman (komponen PageTitle) dan elemen head lainnya (komponen HeadContent) yang diatur oleh komponen-komponen Razor. Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.Tambahkan tag
<script>
untuk scriptblazor.server.js
tepat sebelum bagian renderScripts
(@await RenderSectionAsync(...)
) dalam tata letak aplikasi.Pages/Shared/_Layout.cshtml
(Razor Halaman) atauViews/Shared/_Layout.cshtml
(MVC):<script src="_framework/blazor.server.js"></script>
Kerangka kerja menambahkan skrip
blazor.server.js
ke dalam aplikasi. Tidak perlu menambahkan file skripblazor.server.js
secara manual ke aplikasi.
Tambahkan berkas impor ke folder root proyek dengan isi berikutnya. Ubah placeholder
{APP NAMESPACE}
menjadi namespace proyek._Imports.razor
:@using System.Net.Http @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using {APP NAMESPACE}
Daftarkan layanan Blazor Server di
Program.cs
di mana layanan didaftarkan.builder.Services.AddServerSideBlazor();
Tambahkan titik akhir Blazor Hub ke titik akhir
Program.cs
di mana rute dipetakan.Tempatkan baris berikut setelah pemanggilan ke
MapRazorPages
(Razor Pages) atauMapControllerRoute
(MVC):app.MapBlazorHub();
Integrasikan komponen ke dalam halaman atau tampilan apa pun. Sebagai contoh, tambahkan komponen
Counter
ke folderShared
proyek tersebut.Pages/Shared/Counter.razor
(Razor Halaman) atauViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Halaman:
Di halaman
Index
proyek dari aplikasi Pages Razor, tambahkan namespace komponenCounter
dan tanamkan komponen tersebut ke dalam halaman. Ketika halamanIndex
dimuat, komponenCounter
dirender sebelumnya di dalam halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
MVC:
Dalam tampilan proyek aplikasi MVC, tambahkan namespace komponen dan sematkan komponen ke dalam tampilan. Ketika tampilan
Index
dimuat, komponenCounter
dirender sebelumnya di halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
Untuk informasi lebih lanjut, lihat bagian Render components from a page or view.
Gunakan komponen yang dapat diarahkan dalam aplikasi Pages
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat dirutekan di aplikasi Halaman Razor
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Tambahkan halaman
_Host
ke proyek dengan konten berikut.Pages/_Host.cshtml
:@page "/blazor" @namespace {APP NAMESPACE}.Pages.Shared @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @{ Layout = "_Layout"; } <component type="typeof(App)" render-mode="ServerPrerendered" />
Dalam skenario ini, komponen menggunakan file
_Layout.cshtml
yang dibagikan untuk tata letaknya.Penting
Penggunaan halaman tata letak (
_Layout.cshtml
) dengan Component Tag Helper untuk komponen HeadOutlet diperlukan untuk mengontrol konten<head>
, seperti judul halaman (komponen PageTitle) dan elemen kepala lainnya (komponen HeadContent). Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Pada
Program.cs
titik akhir, tambahkan rute prioritas rendah untuk halaman_Host
sebagai titik akhir terakhir.app.MapFallbackToPage("/_Host");
Tambahkan komponen berjalur ke dalam proyek. Contoh berikut adalah komponen
RoutableCounter
yang didasarkan pada komponenCounter
dalam template proyek Blazor.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Gunakan komponen yang dapat di-routing dalam aplikasi MVC
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat diarahkan dalam aplikasi MVC:
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Tambahkan tampilan
_Host
ke proyek dengan konten berikut.Views/Home/_Host.cshtml
:@namespace {APP NAMESPACE}.Views.Shared @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @{ Layout = "_Layout"; } <component type="typeof(App)" render-mode="ServerPrerendered" />
Komponen menggunakan file bersama
_Layout.cshtml
untuk tata letak mereka.Penting
Penggunaan halaman tata letak (
_Layout.cshtml
) dengan Component Tag Helper untuk komponen HeadOutlet diperlukan untuk mengontrol konten<head>
, seperti judul halaman (komponen PageTitle) dan elemen kepala lainnya (komponen HeadContent). Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Tambahkan tindakan ke pengontrol Home.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Pada endpoint
Program.cs
, tambahkan rute prioritas rendah untuk aksi kontroler yang mengembalikan tampilan_Host
.app.MapFallbackToController("Blazor", "Home");
Buat folder
Pages
dalam aplikasi MVC dan tambahkan komponen-komponen yang dapat diarahkan. Contoh berikut adalah komponenRoutableCounter
yang didasarkan pada komponenCounter
dalam template proyek Blazor.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Render komponen dari halaman atau tampilan
Bagian ini berkaitan dengan menambahkan komponen ke halaman atau tampilan, di mana komponen tersebut tidak dapat langsung diarahkan dari permintaan pengguna.
Untuk merender sebuah komponen dari halaman atau tampilan, gunakan Component Tag Helper.
Render komponen interaktif yang memiliki status
Komponen interaktif berstatus dapat ditambahkan ke halaman atau tampilan Razor.
Ketika halaman atau tampilan dirender:
- Komponen dirender sebelumnya bersamaan dengan halaman atau tampilan.
- Status komponen awal yang digunakan untuk prarender telah hilang.
- Keadaan komponen baru dibuat ketika sambungan SignalR diatur.
Halaman Razor berikut merender komponen Counter
.
<h1>Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Penting
Penggunaan halaman tata letak (_Layout.cshtml
) dengan Component Tag Helper untuk komponen HeadOutlet diperlukan untuk mengontrol konten <head>
, seperti judul halaman (komponen PageTitle) dan elemen kepala lainnya (komponen HeadContent). Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.
Render komponen noninteraktif
Pada halaman Razor berikut, komponen Counter
dirender secara statis dengan nilai awal yang ditentukan menggunakan sebuah formulir. Karena komponen dirender secara statis, komponen tersebut tidak interaktif.
<h1>Razor Page</h1>
<form>
<input type="number" asp-for="InitialValue" />
<button type="submit">Set initial value</button>
</form>
<component type="typeof(Counter)" render-mode="Static"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Penting
Penggunaan halaman tata letak (_Layout.cshtml
) dengan Component Tag Helper untuk komponen HeadOutlet diperlukan untuk mengontrol konten <head>
, seperti judul halaman (komponen PageTitle) dan elemen kepala lainnya (komponen HeadContent). Untuk informasi lebih lanjut, lihat Kontrol konten kepala di aplikasi ASP.NET CoreBlazor.
Namespace Komponen
Saat menggunakan folder kustom untuk menyimpan komponen proyek Razor, tambahkan namespace yang mewakili folder tersebut baik ke halaman/tampilan atau ke file _ViewImports.cshtml
. Pada contoh berikut:
- Komponen disimpan dalam folder
Components
proyek. - Placeholder
{APP NAMESPACE}
adalah namespace proyek.Components
mewakili nama folder.
@using {APP NAMESPACE}.Components
File _ViewImports.cshtml
terletak di folder Pages
dari aplikasi Pages Razor atau folder Views
dari aplikasi MVC.
Untuk informasi lebih lanjut, lihat komponen Razor ASP.NET Core.
Mempertahankan keadaan yang sudah diprender
Tanpa mempertahankan status yang telah dirender sebelumnya, status yang digunakan selama proses perenderan akan hilang dan harus dibuat ulang ketika aplikasi sepenuhnya dimuat. Jika ada status yang diatur secara asinkron, UI mungkin akan berkedip saat UI yang sudah dirender sebelumnya digantikan dengan placeholder sementara, dan kemudian dirender sepenuhnya lagi.
Untuk menyelesaikan masalah ini, Blazor mendukung pelestarian status dalam halaman yang sudah dirender sebelumnya dengan menggunakan Persist Component State Tag Helper. Tambahkan tag Tag Helper, <persist-component-state />
, di dalam tag penutup </body>
.
Pages/_Layout.cshtml
:
<body>
...
<persist-component-state />
</body>
Tentukan status apa yang harus dipertahankan dengan menggunakan layanan PersistentComponentState. PersistentComponentState.RegisterOnPersisting mendaftarkan callback untuk mempertahankan status komponen sebelum aplikasi dihentikan sementara. Status aplikasi diambil kembali ketika aplikasi dilanjutkan. Lakukan panggilan pada akhir dari kode inisialisasi untuk menghindari potensi race condition selama pemadaman aplikasi.
Dalam contoh berikut, komponen WeatherForecastPreserveState
menyimpan keadaan prakiraan cuaca selama prarender dan kemudian mengambil keadaan tersebut untuk menginisialisasi komponen. Tag Helper Persist Component State mempertahankan status komponen setelah semua pemanggilan komponen.
Pages/WeatherForecastPreserveState.razor
:
@page "/weather-forecast-preserve-state"
@implements IDisposable
@using BlazorSample.Shared
@inject IWeatherForecastService WeatherForecastService
@inject PersistentComponentState ApplicationState
<PageTitle>Weather Forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[] forecasts = Array.Empty<WeatherForecast>();
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (!ApplicationState.TryTakeFromJson<WeatherForecast[]>(
nameof(forecasts), out var restored))
{
forecasts =
await WeatherForecastService.GetForecastAsync(DateTime.Now);
}
else
{
forecasts = restored!;
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
}
private Task PersistData()
{
ApplicationState.PersistAsJson(nameof(forecasts), forecasts);
return Task.CompletedTask;
}
void IDisposable.Dispose()
{
persistingSubscription.Dispose();
}
}
Dengan menginisialisasi komponen dengan kondisi yang sama seperti yang digunakan selama pra-rendering, setiap langkah inisialisasi yang mahal hanya dieksekusi satu kali. UI yang dirender juga sesuai dengan UI yang dirender sebelumnya, sehingga tidak terjadi kedipan di browser.
Keadaan yang telah dirender sebelumnya disimpan dan ditransfer ke klien, di mana keadaan ini digunakan untuk memulihkan keadaan komponen. ASP.NET Core Data Protection menjamin bahwa data ditransfer dengan aman dalam aplikasi Blazor Server.
Ukuran status pra-render dan batas ukuran pesan SignalR
Ukuran status prerendered yang besar mungkin melebihi batas ukuran pesan sirkuit Blazor dari SignalR, yang mengakibatkan hal berikut:
- Sirkuit SignalR gagal diinisialisasi dengan kesalahan pada klien: Circuit host not initialized.
- Antarmuka pengguna untuk penyambungan ulang di klien muncul ketika sirkuit gagal berfungsi. Pemulihan tidak mungkin.
Untuk menyelesaikan masalah, gunakan salah satu dari pendekatan berikut ini.
- Kurangi jumlah data yang Anda masukkan ke dalam keadaan prapemrosesan.
- Tingkatkan batas ukuran pesanSignalR. PERINGATAN: Meningkatkan batas dapat meningkatkan risiko terjadinya serangan Denial of Service (DoS).
Sumber daya tambahan Blazor Server
- Manajemen keadaan: Menangani prerendering
-
Razor subjek siklus hidup komponen yang berhubungan dengan prapengrendaan.
-
Inisialisasi komponen (
OnInitialized{Async}
) -
Setelah render komponen (
OnAfterRender{Async}
) - Penyambungan ulang berstatus setelah prerendering
- Prarendering dengan Interop JavaScript
-
Inisialisasi komponen (
- Autentikasi dan otorisasi: Aspek umum
- Menangani Kesalahan: Prarender
- Menghosting dan menyebarkan aplikasi sisi Blazor server ASP.NET Core
- Mitigasi ancaman: Penyusupan silang situs (XSS)
Prerendering dapat meningkatkan Search Engine Optimization (SEO) dengan merender konten untuk respons HTTP awal yang dapat digunakan mesin pencari untuk menghitung peringkat halaman.
Setelah mengonfigurasi proyek, gunakan panduan di bagian berikutnya sesuai dengan persyaratan proyek.
- Komponen yang dapat diarahkan: Untuk komponen yang dapat diarahkan langsung dari permintaan pengguna. Ikuti panduan ini ketika pengunjung harus dapat membuat permintaan HTTP di browser mereka untuk sebuah komponen dengan direktif
@page
. - Render komponen dari halaman atau tampilan: Untuk komponen yang tidak secara langsung dapat diakses dari permintaan pengguna. Ikuti panduan ini ketika aplikasi menyematkan komponen ke dalam halaman atau tampilan yang ada dengan Component Tag Helper.
Konfigurasi
Sebuah aplikasi Pages atau MVC yang sudah ada dapat mengintegrasikan komponen Razor ke dalam halaman atau tampilan Razor.
Dalam file tata letak proyek:
Tambahkan tag
<base>
berikut ke elemen<head>
diPages/Shared/_Layout.cshtml
(Razor Halaman) atauViews/Shared/_Layout.cshtml
(MVC):<base href="~/" />
Nilai
href
( jalur dasar aplikasi) dalam contoh sebelumnya mengasumsikan bahwa aplikasi berada di jalur URL akar (/
). Jika aplikasi adalah sub-aplikasi, lihat ASP.NET Core Blazor jalur dasar aplikasi.Tambahkan tag
<script>
untuk skripblazor.server.js
tepat sebelum bagian renderScripts
.Pages/Shared/_Layout.cshtml
(Razor Halaman) atauViews/Shared/_Layout.cshtml
(MVC):... <script src="_framework/blazor.server.js"></script> @await RenderSectionAsync("Scripts", required: false) </body>
Kerangka kerja menambahkan skrip
blazor.server.js
ke dalam aplikasi. Tidak perlu menambahkan file skripblazor.server.js
secara manual ke aplikasi.
Tambahkan berkas impor ke folder root proyek dengan isi berikutnya. Ubah placeholder
{APP NAMESPACE}
menjadi namespace proyek._Imports.razor
:@using System.Net.Http @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.JSInterop @using {APP NAMESPACE}
Daftarkan layanan Blazor Server di
Startup.ConfigureServices
.Dalam
Startup.cs
:services.AddServerSideBlazor();
Tambahkan titik akhir Hub Blazor ke titik akhir (
app.UseEndpoints
) dariStartup.Configure
.Startup.cs
:endpoints.MapBlazorHub();
Integrasikan komponen ke dalam halaman atau tampilan apa pun. Sebagai contoh, tambahkan komponen
Counter
ke folderShared
proyek tersebut.Pages/Shared/Counter.razor
(Razor Halaman) atauViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Halaman:
Di halaman
Index
proyek dari aplikasi Pages Razor, tambahkan namespace komponenCounter
dan tanamkan komponen tersebut ke dalam halaman. Ketika halamanIndex
dimuat, komponenCounter
dirender sebelumnya di dalam halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Pada contoh sebelumnya, ganti placeholder
{APP NAMESPACE}
dengan namespace aplikasi.MVC:
Dalam tampilan proyek aplikasi MVC, tambahkan namespace komponen dan sematkan komponen ke dalam tampilan. Ketika tampilan
Index
dimuat, komponenCounter
dirender sebelumnya di halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Untuk informasi lebih lanjut, lihat bagian Render components from a page or view.
Gunakan komponen yang dapat diarahkan dalam aplikasi Pages
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat dirutekan di aplikasi Halaman Razor
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
Catatan
Dengan rilis .NET 5.0.1 dan untuk rilis 5.x tambahan,
Router
komponen menyertakan parameterPreferExactMatches
diatur ke@true
. Untuk informasi selengkapnya, lihat Migrasi dari ASP.NET Core 3.1 ke .NET 5.Tambahkan halaman
_Host
ke proyek dengan konten berikut.Pages/_Host.cshtml
:@page "/blazor" @{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Komponen menggunakan file bersama
_Layout.cshtml
untuk tata letak mereka.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Di endpoint
Startup.Configure
dariStartup.cs
, tambahkan rute prioritas rendah untuk halaman_Host
sebagai endpoint terakhir.endpoints.MapFallbackToPage("/_Host");
Contoh berikut menunjukkan baris yang ditambahkan dalam konfigurasi titik akhir aplikasi yang biasa.
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); });
Tambahkan komponen berjalur ke dalam proyek.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Gunakan komponen yang dapat di-routing dalam aplikasi MVC
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat diarahkan dalam aplikasi MVC:
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
Catatan
Dengan rilis .NET 5.0.1 dan untuk rilis 5.x tambahan,
Router
komponen menyertakan parameterPreferExactMatches
diatur ke@true
. Untuk informasi selengkapnya, lihat Migrasi dari ASP.NET Core 3.1 ke .NET 5.Tambahkan tampilan
_Host
ke proyek dengan konten berikut.Views/Home/_Host.cshtml
:@{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Komponen menggunakan file bersama
_Layout.cshtml
untuk tata letak mereka.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Tambahkan tindakan ke pengontrol Home.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Di endpoint
Startup.Configure
dariStartup.cs
, tambahkan rute prioritas rendah untuk aksi pengendali yang mengembalikan tampilan_Host
.endpoints.MapFallbackToController("Blazor", "Home");
Contoh berikut menunjukkan baris yang ditambahkan dalam konfigurasi titik akhir aplikasi yang biasa.
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapBlazorHub(); endpoints.MapFallbackToController("Blazor", "Home"); });
Tambahkan komponen berjalur ke dalam proyek.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Render komponen dari halaman atau tampilan
Bagian ini berkaitan dengan menambahkan komponen ke halaman atau tampilan, di mana komponen tersebut tidak dapat langsung diarahkan dari permintaan pengguna.
Untuk merender sebuah komponen dari halaman atau tampilan, gunakan Component Tag Helper.
Render komponen interaktif yang memiliki status
Komponen interaktif berstatus dapat ditambahkan ke halaman atau tampilan Razor.
Ketika halaman atau tampilan dirender:
- Komponen dirender sebelumnya bersamaan dengan halaman atau tampilan.
- Status komponen awal yang digunakan untuk prarender telah hilang.
- Keadaan komponen baru dibuat ketika sambungan SignalR diatur.
Halaman Razor berikut merender komponen Counter
.
<h1>My Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Render komponen noninteraktif
Pada halaman Razor berikut, komponen Counter
dirender secara statis dengan nilai awal yang ditentukan menggunakan sebuah formulir. Karena komponen dirender secara statis, komponen tersebut tidak interaktif.
<h1>My Razor Page</h1>
<form>
<input type="number" asp-for="InitialValue" />
<button type="submit">Set initial value</button>
</form>
<component type="typeof(Counter)" render-mode="Static"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Namespace Komponen
Saat menggunakan folder kustom untuk menyimpan komponen proyek Razor, tambahkan namespace yang mewakili folder tersebut baik ke halaman/tampilan atau ke file _ViewImports.cshtml
. Pada contoh berikut:
- Komponen disimpan dalam folder
Components
proyek. - Placeholder
{APP NAMESPACE}
adalah namespace proyek.Components
mewakili nama folder.
@using {APP NAMESPACE}.Components
File _ViewImports.cshtml
terletak di folder Pages
dari aplikasi Pages Razor atau folder Views
dari aplikasi MVC.
Untuk informasi lebih lanjut, lihat komponen Razor ASP.NET Core.
Ukuran status pra-render dan batas ukuran pesan SignalR
Ukuran status prerendered yang besar mungkin melebihi batas ukuran pesan sirkuit Blazor dari SignalR, yang mengakibatkan hal berikut:
- Sirkuit SignalR gagal diinisialisasi dengan kesalahan pada klien: Circuit host not initialized.
- Antarmuka pengguna untuk penyambungan ulang di klien muncul ketika sirkuit gagal berfungsi. Pemulihan tidak mungkin.
Untuk menyelesaikan masalah, gunakan salah satu dari pendekatan berikut ini.
- Kurangi jumlah data yang Anda masukkan ke dalam keadaan prapemrosesan.
- Tingkatkan batas ukuran pesanSignalR. PERINGATAN: Meningkatkan batas dapat meningkatkan risiko terjadinya serangan Denial of Service (DoS).
Sumber daya tambahan Blazor Server
- Manajemen keadaan: Menangani prerendering
-
Razor subjek siklus hidup komponen yang berhubungan dengan prapengrendaan.
-
Inisialisasi komponen (
OnInitialized{Async}
) -
Setelah render komponen (
OnAfterRender{Async}
) - Penyambungan ulang berstatus setelah prerendering
- Prarendering dengan Interop JavaScript
-
Inisialisasi komponen (
- Autentikasi dan otorisasi: Aspek umum
- Menangani Kesalahan: Prarender
- Menghosting dan menyebarkan aplikasi sisi Blazor server ASP.NET Core
- Mitigasi ancaman: Penyusupan silang situs (XSS)
Komponen Razor dapat diintegrasikan ke dalam Halaman Razor atau aplikasi MVC. Ketika halaman atau tampilan dirender, komponen dapat diprerender pada saat yang sama.
Prerendering dapat meningkatkan Search Engine Optimization (SEO) dengan merender konten untuk respons HTTP awal yang dapat digunakan mesin pencari untuk menghitung peringkat halaman.
Setelah mengonfigurasi proyek, gunakan panduan di bagian berikutnya sesuai dengan persyaratan proyek.
- Komponen yang dapat diarahkan: Untuk komponen yang dapat diarahkan langsung dari permintaan pengguna. Ikuti panduan ini ketika pengunjung harus dapat membuat permintaan HTTP di browser mereka untuk sebuah komponen dengan direktif
@page
. - Render komponen dari halaman atau tampilan: Untuk komponen yang tidak secara langsung dapat diakses dari permintaan pengguna. Ikuti panduan ini ketika aplikasi menyematkan komponen ke dalam halaman atau tampilan yang ada dengan Component Tag Helper.
Konfigurasi
Sebuah aplikasi Pages atau MVC yang sudah ada dapat mengintegrasikan komponen Razor ke dalam halaman atau tampilan Razor.
Dalam file tata letak proyek:
Tambahkan tag
<base>
berikut ke elemen<head>
diPages/Shared/_Layout.cshtml
(Razor Halaman) atauViews/Shared/_Layout.cshtml
(MVC):+ <base href="~/" />
Nilai
href
( jalur dasar aplikasi) dalam contoh sebelumnya mengasumsikan bahwa aplikasi berada di jalur URL akar (/
). Jika aplikasi adalah sub-aplikasi, lihat ASP.NET Core Blazor jalur dasar aplikasi.Tambahkan tag
<script>
untuk skripblazor.server.js
tepat sebelum bagian renderScripts
.Pages/Shared/_Layout.cshtml
(Razor Halaman) atauViews/Shared/_Layout.cshtml
(MVC):... <script src="_framework/blazor.server.js"></script> @await RenderSectionAsync("Scripts", required: false) </body>
Kerangka kerja menambahkan skrip
blazor.server.js
ke dalam aplikasi. Tidak perlu menambahkan file skripblazor.server.js
secara manual ke aplikasi.
Tambahkan berkas impor ke folder root proyek dengan isi berikutnya. Ubah placeholder
{APP NAMESPACE}
menjadi namespace proyek._Imports.razor
:@using System.Net.Http @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.JSInterop @using {APP NAMESPACE}
Daftarkan layanan Blazor Server di
Startup.ConfigureServices
.Startup.cs
:services.AddServerSideBlazor();
Tambahkan titik akhir Hub Blazor ke titik akhir (
app.UseEndpoints
) dariStartup.Configure
.Startup.cs
:endpoints.MapBlazorHub();
Integrasikan komponen ke dalam halaman atau tampilan apa pun. Sebagai contoh, tambahkan komponen
Counter
ke folderShared
proyek tersebut.Pages/Shared/Counter.razor
(Razor Halaman) atauViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Halaman:
Di halaman
Index
proyek dari aplikasi Pages Razor, tambahkan namespace komponenCounter
dan tanamkan komponen tersebut ke dalam halaman. Ketika halamanIndex
dimuat, komponenCounter
dirender sebelumnya di dalam halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Pada contoh sebelumnya, ganti placeholder
{APP NAMESPACE}
dengan namespace aplikasi.MVC:
Dalam tampilan proyek aplikasi MVC, tambahkan namespace komponen dan sematkan komponen ke dalam tampilan. Ketika tampilan
Index
dimuat, komponenCounter
dirender sebelumnya di halaman. Dalam contoh berikut, gantilah placeholder{APP NAMESPACE}
dengan namespace proyek.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Untuk informasi lebih lanjut, lihat bagian Render components from a page or view.
Gunakan komponen yang dapat diarahkan dalam aplikasi Pages
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat dirutekan di aplikasi Halaman Razor
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
Tambahkan halaman
_Host
ke proyek dengan konten berikut.Pages/_Host.cshtml
:@page "/blazor" @{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Komponen menggunakan file bersama
_Layout.cshtml
untuk tata letak mereka.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Di endpoint
Startup.Configure
dariStartup.cs
, tambahkan rute prioritas rendah untuk halaman_Host
sebagai endpoint terakhir.endpoints.MapFallbackToPage("/_Host");
Contoh berikut menunjukkan baris yang ditambahkan dalam konfigurasi titik akhir aplikasi yang biasa.
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); });
Tambahkan komponen berjalur ke dalam proyek.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Gunakan komponen yang dapat di-routing dalam aplikasi MVC
Bagian ini berkaitan dengan penambahan komponen yang dapat langsung dirutekan dari permintaan pengguna.
Untuk mendukung komponen Razor yang dapat diarahkan dalam aplikasi MVC:
Ikuti panduan di bagian Konfigurasi.
Tambahkan komponen
App
ke root proyek dengan konten berikut.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
Tambahkan tampilan
_Host
ke proyek dengan konten berikut.Views/Home/_Host.cshtml
:@{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Komponen menggunakan file bersama
_Layout.cshtml
untuk tata letak mereka.RenderMode mengkonfigurasi apakah komponen
App
.- Telah diprarender ke dalam halaman.
- Apakah di-render sebagai HTML statis pada halaman atau jika itu mencakup informasi yang diperlukan untuk memulai aplikasi Blazor dari agen pengguna.
Untuk informasi lebih lanjut tentang Component Tag Helper, termasuk penerusan parameter dan konfigurasi RenderMode, lihat Component Tag Helper di ASP.NET Core.
Tambahkan tindakan ke pengontrol Home.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Di endpoint
Startup.Configure
dariStartup.cs
, tambahkan rute prioritas rendah untuk aksi pengendali yang mengembalikan tampilan_Host
.endpoints.MapFallbackToController("Blazor", "Home");
Contoh berikut menunjukkan baris yang ditambahkan dalam konfigurasi titik akhir aplikasi yang biasa.
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapBlazorHub(); endpoints.MapFallbackToController("Blazor", "Home"); });
Tambahkan komponen berjalur ke dalam proyek.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Jalankan proyek dan navigasikan ke komponen yang dapat diuraikan
RoutableCounter
di/routable-counter
.
Untuk informasi lebih lanjut tentang ruang nama, lihat bagian Ruang nama Komponen.
Render komponen dari halaman atau tampilan
Bagian ini berkaitan dengan menambahkan komponen ke halaman atau tampilan, di mana komponen tersebut tidak dapat langsung diarahkan dari permintaan pengguna.
Untuk merender sebuah komponen dari halaman atau tampilan, gunakan Component Tag Helper.
Render komponen interaktif yang memiliki status
Komponen interaktif berstatus dapat ditambahkan ke halaman atau tampilan Razor.
Ketika halaman atau tampilan dirender:
- Komponen dirender sebelumnya bersamaan dengan halaman atau tampilan.
- Status komponen awal yang digunakan untuk prarender telah hilang.
- Keadaan komponen baru dibuat ketika sambungan SignalR diatur.
Halaman Razor berikut merender komponen Counter
.
<h1>My Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Render komponen noninteraktif
Pada halaman Razor berikut, komponen Counter
dirender secara statis dengan nilai awal yang ditentukan menggunakan sebuah formulir. Karena komponen dirender secara statis, komponen tersebut tidak interaktif.
<h1>My Razor Page</h1>
<form>
<input type="number" asp-for="InitialValue" />
<button type="submit">Set initial value</button>
</form>
<component type="typeof(Counter)" render-mode="Static"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Untuk informasi lebih lanjut, lihat Component Tag Helper di ASP.NET Core.
Namespace Komponen
Saat menggunakan folder kustom untuk menyimpan komponen proyek Razor, tambahkan namespace yang mewakili folder tersebut baik ke halaman/tampilan atau ke file _ViewImports.cshtml
. Pada contoh berikut:
- Komponen disimpan dalam folder
Components
proyek. - Placeholder
{APP NAMESPACE}
adalah namespace proyek.Components
mewakili nama folder.
@using {APP NAMESPACE}.Components
File _ViewImports.cshtml
terletak di folder Pages
dari aplikasi Pages Razor atau folder Views
dari aplikasi MVC.
Untuk informasi lebih lanjut, lihat komponen Razor ASP.NET Core.
Ukuran status pra-render dan batas ukuran pesan SignalR
Ukuran status prerendered yang besar mungkin melebihi batas ukuran pesan sirkuit Blazor dari SignalR, yang mengakibatkan hal berikut:
- Sirkuit SignalR gagal diinisialisasi dengan kesalahan pada klien: Circuit host not initialized.
- Antarmuka pengguna untuk penyambungan ulang di klien muncul ketika sirkuit gagal berfungsi. Pemulihan tidak mungkin.
Untuk menyelesaikan masalah, gunakan salah satu dari pendekatan berikut ini.
- Kurangi jumlah data yang Anda masukkan ke dalam keadaan prapemrosesan.
- Tingkatkan batas ukuran pesanSignalR. PERINGATAN: Meningkatkan batas dapat meningkatkan risiko terjadinya serangan Denial of Service (DoS).
Sumber daya tambahan Blazor Server
- Manajemen keadaan: Menangani prerendering
-
Razor subjek siklus hidup komponen yang berhubungan dengan prapengrendaan.
-
Inisialisasi komponen (
OnInitialized{Async}
) -
Setelah render komponen (
OnAfterRender{Async}
) - Penyambungan ulang berstatus setelah prerendering
- Prarendering dengan Interop JavaScript
-
Inisialisasi komponen (
- Autentikasi dan otorisasi: Aspek umum
- Menangani Kesalahan: Prarender
- Menghosting dan menyebarkan aplikasi sisi Blazor server ASP.NET Core
- Mitigasi ancaman: Penyusupan silang situs (XSS)
ASP.NET Core