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 .NET 9 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.
Artikel ini menjelaskan cara mengelola Blazor perutean permintaan aplikasi dan cara menggunakan NavLink komponen untuk membuat tautan navigasi.
Penting
Contoh kode di seluruh artikel ini menunjukkan metode yang dipanggil pada Navigation
, yang disuntikkan sebagai NavigationManager dalam kelas dan komponen.
Perutean statis versus interaktif
Bagian ini berlaku untuk Blazor Web Apps.
Jika prerendering diaktifkan, Blazor router (Router
komponen, <Router>
dalam Routes.razor
) melakukan perutean statis ke komponen selama penyajian sisi server statis (SSR). Jenis perutean ini disebut perutean statis.
Ketika mode render interaktif ditetapkan pada komponen Routes
, router Blazor menjadi interaktif setelah SSR statis dengan perutean statis di server. Jenis perutean ini disebut perutean interaktif.
Router statis menggunakan perutean titik akhir dan jalur permintaan HTTP untuk menentukan komponen mana yang akan dirender. Ketika router menjadi interaktif, router menggunakan URL dokumen (URL di bilah alamat browser) untuk menentukan komponen mana yang akan dirender. Ini berarti bahwa router interaktif dapat secara dinamis mengubah komponen mana yang dirender jika URL dokumen berubah secara dinamis ke URL internal lain yang valid, dan dapat melakukannya tanpa melakukan permintaan HTTP untuk mengambil konten halaman baru.
Routing interaktif juga mencegah prarendering karena konten halaman baru tidak diminta dari server dengan permintaan halaman yang biasa. Untuk informasi selengkapnya, lihat Prerender ASP.NET Core Razor komponen.
Pola Rute
Router komponen memungkinkan perutean ke komponen Razor dan terletak di komponen aplikasi Routes
(Components/Routes.razor
).
Komponen Router memungkinkan perutean ke komponen Razor. Komponen Router digunakan dalam App
komponen (App.razor
).
Razor Ketika komponen (.razor
) dengan direktif @page
dikompilasi, kelas komponen yang dihasilkan diberi spesifikasi RouteAttribute yang menentukan templat rute komponen.
Ketika aplikasi dimulai, rakitan yang telah ditentukan sebagai AppAssembly
pada Router dipindai untuk mengumpulkan informasi rute bagi komponen aplikasi yang memiliki RouteAttribute.
Pada saat runtime, komponen RouteView:
- Menerima RouteData dari Router beserta parameter rute apa pun.
- Merender komponen yang ditentukan dengan tata letaknya, termasuk tata letak berlapis lebih lanjut.
Secara opsional tentukan DefaultLayout parameter dengan kelas tata letak untuk komponen yang tidak menentukan tata letak dengan direktif@layout
. Kerangka kerja templat proyekBlazor menentukan MainLayout
komponen (MainLayout.razor
) sebagai tata letak default aplikasi. Untuk informasi selengkapnya tentang tata letak, lihat Blazor ASP.NET Core.
Komponen mendukung beberapa templat rute menggunakan beberapa @page
arahan. Contoh komponen berikut dimuat pada permintaan untuk /blazor-route
dan /different-blazor-route
.
BlazorRoute.razor
:
@page "/blazor-route"
@page "/different-blazor-route"
<PageTitle>Routing</PageTitle>
<h1>Routing Example</h1>
<p>
This page is reached at either <code>/blazor-route</code> or
<code>/different-blazor-route</code>.
</p>
@page "/blazor-route"
@page "/different-blazor-route"
<PageTitle>Routing</PageTitle>
<h1>Routing Example</h1>
<p>
This page is reached at either <code>/blazor-route</code> or
<code>/different-blazor-route</code>.
</p>
@page "/blazor-route"
@page "/different-blazor-route"
<h1>Blazor routing</h1>
@page "/blazor-route"
@page "/different-blazor-route"
<h1>Blazor routing</h1>
@page "/blazor-route"
@page "/different-blazor-route"
<h1>Blazor routing</h1>
@page "/blazor-route"
@page "/different-blazor-route"
<h1>Blazor routing</h1>
Penting
Agar URL diresolusikan dengan benar, aplikasi harus menyertakan tag <base>
(lokasi <head>
konten) dengan jalur dasar aplikasi yang ditentukan dalam atribut href
. Untuk informasi selengkapnya, lihat jalur dasar aplikasi ASP.NET CoreBlazor.
Router tidak berinteraksi dengan nilai string kueri. Untuk bekerja dengan string kueri, lihat bagian String kueri .
Sebagai alternatif untuk menentukan templat rute sebagai string literal dengan @page
direktif, templat rute berbasis konstan dapat ditentukan dengan direktif@attribute
.
Dalam contoh berikut, arahan @page
dalam komponen diganti dengan @attribute
direktif dan templat rute berbasis konstanta di Constants.CounterRoute
, yang diatur di tempat lain di aplikasi ke "/counter
":
- @page "/counter"
+ @attribute [Route(Constants.CounterRoute)]
Catatan
Dengan rilis .NET 5.0.1 dan untuk rilis 5.x tambahan, Router
komponen menyertakan parameter PreferExactMatches
diatur ke @true
. Untuk informasi selengkapnya, lihat Migrasi dari ASP.NET Core 3.1 ke .NET 5.
Memusatkan perhatian pada elemen navigasi
Komponen FocusOnNavigate mengatur fokus UI ke elemen berdasarkan pemilih CSS setelah menavigasi dari satu halaman ke halaman lainnya.
<FocusOnNavigate RouteData="routeData" Selector="h1" />
Router Saat komponen menavigasi ke halaman baru, FocusOnNavigate komponen mengatur fokus ke header tingkat atas halaman (<h1>
). Ini adalah strategi umum untuk memastikan bahwa navigasi halaman diumumkan saat menggunakan pembaca layar.
Sediakan konten kustom saat konten tidak ditemukan
Komponen ini Router memungkinkan aplikasi menentukan konten kustom jika konten tidak ditemukan untuk rute yang diminta.
Atur konten khusus untuk parameter Router dari komponen NotFound.
<Router ...>
...
<NotFound>
...
</NotFound>
</Router>
Item sembarang didukung sebagai konten dari parameter NotFound, seperti komponen interaktif lainnya. Untuk menerapkan tata letak default ke NotFound konten, lihat tata letak Blazor ASP.NET Core.
Penting
Blazor Web Apptidak menggunakan parameter NotFound (markup<NotFound>...</NotFound>
), tetapi parameter ini didukung untuk kompatibilitas mundur guna menghindari perubahan yang dapat menyebabkan kerusakan dalam kerangka kerja. Sisi server alur middleware ASP.NET Core memproses permintaan di server. Gunakan teknik sisi server untuk menangani permintaan buruk.
† yang didukung dalam konteks ini berarti bahwa menempatkan markup <NotFound>...</NotFound>
tidak menghasilkan pengecualian, tetapi menggunakan markup juga tidak efektif.
Untuk informasi selengkapnya, termasuk pendekatan yang direkomendasikan untuk menangani permintaan buruk, lihat mode render ASP.NET Core Blazor.
Mengarahkan ke komponen dari beberapa rakitan
Bagian ini berlaku untuk Blazor Web Apps.
Gunakan parameter komponen Router dan pembangun konvensi titik akhir AdditionalAssemblies untuk menemukan komponen yang dapat dirutekan di dalam rakitan tambahan. Sub bagian berikut menjelaskan kapan dan bagaimana menggunakan setiap API.
Pengaturan Rute Statis
Untuk menemukan komponen yang dapat diarahkan dari rakitan tambahan untuk penyajian sisi server statis (SSR statis), walaupun router nantinya menjadi interaktif untuk penyajian, rakitan harus dinyatakan dalam kerangka kerja Blazor. Panggil metode AddAdditionalAssemblies dengan rakitan tambahan yang digabungkan ke MapRazorComponents dalam file Program
proyek server.
Contoh berikut mencakup komponen yang bisa diroute dalam perakitan proyek BlazorSample.Client
menggunakan file _Imports.razor
proyek:
app.MapRazorComponents<App>()
.AddAdditionalAssemblies(typeof(BlazorSample.Client._Imports).Assembly);
Catatan
Panduan sebelumnya juga berlaku dalam skenario perpustakaan kelas komponen. Panduan penting tambahan untuk pustaka kelas dan SSR statis ditemukan di pustaka kelas inti Razor (RCL) ASP.NET dengan penyajian sisi server statis (SSR statis).
Perutean interaktif
Mode pembuat-gambar interaktif dapat ditetapkan ke komponen Routes
(Routes.razor
) yang membuat router Blazor menjadi interaktif setelah SSR statis dan routing statis di server. Misalnya, <Routes @rendermode="InteractiveServer" />
mengatur penyajian sisi server interaktif (SSR interaktif) pada komponen Routes
. Komponen Router
mewarisi penyajian sisi server interaktif (SSRI) dari Routes
. Router menjadi lebih interaktif setelah melakukan perutean statis pada server.
Navigasi internal untuk routing interaktif tidak melibatkan permintaan konten halaman baru dari server. Oleh karena itu, pra-rendering tidak terjadi untuk permintaan halaman internal. Untuk informasi selengkapnya, lihat Prerender ASP.NET Core Razor komponen.
Jika komponen Routes
didefinisikan dalam proyek server, parameter AdditionalAssemblies dari komponen Router
harus menyertakan assembly proyek .Client
. Ini memungkinkan router untuk berfungsi dengan benar ketika dirender secara interaktif.
Dalam contoh berikut, komponen Routes
berada dalam proyek server, dan file _Imports.razor
dari proyek BlazorSample.Client
menunjukkan assembly untuk mencari komponen yang routable.
<Router
AppAssembly="..."
AdditionalAssemblies="[ typeof(BlazorSample.Client._Imports).Assembly ]">
...
</Router>
Rakitan tambahan dipindai selain rakitan yang ditentukan oleh AppAssembly.
Catatan
Panduan sebelumnya juga berlaku dalam skenario perpustakaan kelas komponen.
Atau, komponen yang dapat dirutekan hanya terdapat dalam proyek .Client
dengan WebAssembly Interaktif global atau pengaturan Rendering otomatis yang diterapkan, serta komponen Routes
didefinisikan dalam proyek .Client
, bukan proyek server. Dalam hal ini, tidak ada rakitan eksternal dengan komponen yang dapat dirutekan, sehingga tidak perlu menentukan nilai untuk AdditionalAssemblies.
Bagian ini berlaku untuk Blazor Server aplikasi.
Gunakan parameter komponen Router dan pembangun konvensi titik akhir AdditionalAssemblies untuk menemukan komponen yang dapat dirutekan di dalam rakitan tambahan.
Dalam contoh berikut, Component1
adalah komponen yang dapat dirutekan yang ditentukan dalam pustaka kelas komponen yang dirujuk bernama ComponentLibrary
:
<Router
AppAssembly="..."
AdditionalAssemblies="new[] { typeof(ComponentLibrary.Component1).Assembly }">
...
</Router>
Rakitan tambahan dipindai selain rakitan yang ditentukan oleh AppAssembly.
Parameter rute
Router menggunakan parameter rute untuk mengisi parameter komponen yang sesuai dengan nama yang sama. Nama parameter rute tidak sensitif terhadap penggunaan huruf besar atau kecil. Dalam contoh berikut, text
parameter menetapkan nilai segmen rute ke properti komponen Text
. Ketika permintaan dibuat untuk /route-parameter-1/amazing
, konten dirender sebagai Blazor is amazing!
.
RouteParameter1.razor
:
@page "/route-parameter-1/{text}"
<PageTitle>Route Parameter 1</PageTitle>
<h1>Route Parameter Example 1</h1>
<p>Blazor is @Text!</p>
@code {
[Parameter]
public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"
<PageTitle>Route Parameter 1</PageTitle>
<h1>Route Parameter Example 1</h1>
<p>Blazor is @Text!</p>
@code {
[Parameter]
public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string Text { get; set; }
}
@page "/route-parameter-1/{text}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string Text { get; set; }
}
Parameter opsional didukung. Dalam contoh berikut, parameter opsional text
menetapkan nilai segmen rute ke properti Text
komponen. Jika segmen tidak ada, nilai Text
diatur ke fantastic
.
Parameter opsional tidak didukung. Dalam contoh berikut, diterapkan dua arahan {text}
nilai parameter rute ke properti komponen Text
.
RouteParameter2.razor
:
@page "/route-parameter-2/{text?}"
<PageTitle>Route Parameter 2</PageTitle>
<h1>Route Parameter Example 2</h1>
<p>Blazor is @Text!</p>
@code {
[Parameter]
public string? Text { get; set; }
protected override void OnParametersSet() => Text = Text ?? "fantastic";
}
@page "/route-parameter-2/{text?}"
<PageTitle>Route Parameter 2</PageTitle>
<h1>Route Parameter Example 2</h1>
<p>Blazor is @Text!</p>
@code {
[Parameter]
public string? Text { get; set; }
protected override void OnParametersSet() => Text = Text ?? "fantastic";
}
@page "/route-parameter-2/{text?}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string? Text { get; set; }
protected override void OnParametersSet()
{
Text = Text ?? "fantastic";
}
}
@page "/route-parameter-2/{text?}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string? Text { get; set; }
protected override void OnParametersSet()
{
Text = Text ?? "fantastic";
}
}
@page "/route-parameter-2/{text?}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string Text { get; set; }
protected override void OnParametersSet()
{
Text = Text ?? "fantastic";
}
}
@page "/route-parameter-2"
@page "/route-parameter-2/{text}"
<h1>Blazor is @Text!</h1>
@code {
[Parameter]
public string Text { get; set; }
protected override void OnParametersSet()
{
Text = Text ?? "fantastic";
}
}
Ketika OnInitialized{Async}
siklus hidup digunakan alih-alih OnParametersSet{Async}
siklus hidup, penetapan default Text
properti fantastic
tidak terjadi jika pengguna menavigasi dalam komponen yang sama. Misalnya, situasi ini muncul ketika pengguna menavigasi dari /route-parameter-2/amazing
ke /route-parameter-2
. Saat instans komponen bertahan dan menerima parameter baru, OnInitialized
metode tidak dipanggil lagi.
Catatan
Parameter rute tidak bisa digunakan untuk nilai string kueri. Untuk bekerja dengan string kueri, lihat bagian String kueri .
Batasan rute
Batasan rute mengharuskan pencocokan jenis pada segmen rute terhadap komponen.
Dalam contoh berikut, rute ke komponen User
hanya cocok jika:
-
Id
Segmen rute ada di URL permintaan. - Segmen
Id
adalah jenis bilangan bulat (int
).
User.razor
:
@page "/user/{Id:int}"
<PageTitle>User</PageTitle>
<h1>User Example</h1>
<p>User Id: @Id</p>
@code {
[Parameter]
public int Id { get; set; }
}
Catatan
Batasan rute tidak berfungsi dengan nilai string kueri. Untuk bekerja dengan string kueri, lihat bagian String kueri .
Batasan rute yang diperlihatkan dalam tabel berikut ini tersedia. Untuk batasan rute yang cocok dengan budaya invarian, lihat peringatan di bawah tabel untuk informasi selengkapnya.
Batasan | Contoh | Contoh Kecocokan | Invarian budaya Kecocokan |
---|---|---|---|
bool |
{active:bool} |
true , FALSE |
Tidak |
datetime |
{dob:datetime} |
2016-12-31 , 2016-12-31 7:32pm |
Ya |
decimal |
{price:decimal} |
49.99 , -1,000.01 |
Ya |
double |
{weight:double} |
1.234 , -1,001.01e8 |
Ya |
float |
{weight:float} |
1.234 , -1,001.01e8 |
Ya |
guid |
{id:guid} |
00001111-aaaa-2222-bbbb-3333cccc4444 , {00001111-aaaa-2222-bbbb-3333cccc4444} |
Tidak |
int |
{id:int} |
123456789 , -123456789 |
Ya |
long |
{ticks:long} |
123456789 , -123456789 |
Ya |
nonfile |
{parameter:nonfile} |
Bukan BlazorSample.styles.css , bukan favicon.ico |
Ya |
Peringatan
Batasan rute yang memverifikasi URL dan dikonversi ke jenis CLR (seperti int
atau DateTime) selalu menggunakan budaya yang invarian. Batasan ini mengasumsikan bahwa URL tidak dapat dilokalkan.
Batasan rute juga berfungsi dengan parameter opsional. Dalam contoh berikut, Id
diperlukan, tetapi Option
merupakan parameter rute boolean opsional.
User.razor
:
@page "/user/{id:int}/{option:bool?}"
<p>
Id: @Id
</p>
<p>
Option: @Option
</p>
@code {
[Parameter]
public int Id { get; set; }
[Parameter]
public bool Option { get; set; }
}
Hindari pengambilan file dalam parameter rute
Templat rute berikut secara tidak sengaja mengambil jalur aset statis dalam parameter rute opsionalnya (Optional
). Misalnya, stylesheet aplikasi (.styles.css
) direkam, yang menyebabkan rusaknya gaya aplikasi:
@page "/{optional?}"
...
@code {
[Parameter]
public string? Optional { get; set; }
}
Untuk membatasi parameter rute untuk menangkap jalur non-file, gunakan :nonfile
batasan dalam templat rute:
@page "/{optional:nonfile?}"
Perutean dengan URL yang berisi titik-titik
Template rute default sisi server mengasumsikan bahwa jika segmen terakhir URL permintaan berisi titik (.
) bahwa file diminta. Misalnya, URL /example/some.thing
relatif ditafsirkan oleh router sebagai permintaan untuk file bernama some.thing
. Tanpa konfigurasi tambahan, aplikasi mengembalikan respons 404 - Tidak Ditemukan jika some.thing
dimaksudkan untuk merutekan ke komponen dengan @page
direktif dan some.thing
merupakan nilai parameter rute. Untuk menggunakan rute dengan satu atau beberapa parameter yang berisi titik, aplikasi harus mengonfigurasi rute dengan templat kustom.
Pertimbangkan komponen berikut Example
yang dapat menerima parameter rute dari segmen terakhir URL.
Example.razor
:
@page "/example/{param?}"
<p>
Param: @Param
</p>
@code {
[Parameter]
public string? Param { get; set; }
}
@page "/example/{param?}"
<p>
Param: @Param
</p>
@code {
[Parameter]
public string? Param { get; set; }
}
@page "/example/{param?}"
<p>
Param: @Param
</p>
@code {
[Parameter]
public string Param { get; set; }
}
@page "/example"
@page "/example/{param}"
<p>
Param: @Param
</p>
@code {
[Parameter]
public string Param { get; set; }
}
Untuk mengizinkan aplikasi dari solusi yang dihosting oleh Server untuk merutekan permintaan dengan titik dalam parameter rute Blazor WebAssembly, tambahkan templat rute berkas cadangan dengan parameter opsional pada berkas .
app.MapFallbackToFile("/example/{param?}", "index.html");
Untuk mengonfigurasi aplikasi Blazor Server agar dapat merutekan permintaan dengan titik pada parameter rute param
, tambahkan templat rute laman cadangan dengan parameter opsional dalam file Program
.
app.MapFallbackToPage("/example/{param?}", "/_Host");
Untuk informasi lebih lanjut, lihat Perutean di ASP.NET Core.
Untuk mengizinkan aplikasi
Startup.cs
:
endpoints.MapFallbackToFile("/example/{param?}", "index.html");
Untuk mengonfigurasi aplikasi Blazor Server agar dapat merutekan permintaan dengan titik pada parameter rute param
, tambahkan templat rute halaman fallback dengan parameter opsional di Startup.Configure
.
Startup.cs
:
endpoints.MapFallbackToPage("/example/{param?}", "/_Host");
Untuk informasi lebih lanjut, lihat Perutean di ASP.NET Core.
Parameter serbaguna untuk rute
Parameter rute "catch-all", yang menangkap jalur melintasi beberapa batas folder, didukung dalam komponen.
Parameter rute serba guna adalah:
- Dinamai agar sesuai dengan nama segmen rute. Penamaan tidak sensitif terhadap huruf besar/kecil.
- Tipe
string
. Kerangka kerja tidak menyediakan konversi tipe otomatis. - Di akhir URL.
CatchAll.razor
:
@page "/catch-all/{*pageRoute}"
<PageTitle>Catch All</PageTitle>
<h1>Catch All Parameters Example</h1>
<p>Add some URI segments to the route and request the page again.</p>
<p>
PageRoute: @PageRoute
</p>
@code {
[Parameter]
public string? PageRoute { get; set; }
}
@page "/catch-all/{*pageRoute}"
<PageTitle>Catch All</PageTitle>
<h1>Catch All Parameters Example</h1>
<p>Add some URI segments to the route and request the page again.</p>
<p>
PageRoute: @PageRoute
</p>
@code {
[Parameter]
public string? PageRoute { get; set; }
}
@page "/catch-all/{*pageRoute}"
@code {
[Parameter]
public string? PageRoute { get; set; }
}
@page "/catch-all/{*pageRoute}"
@code {
[Parameter]
public string? PageRoute { get; set; }
}
@page "/catch-all/{*pageRoute}"
@code {
[Parameter]
public string PageRoute { get; set; }
}
Untuk URL /catch-all/this/is/a/test
dengan templat rute /catch-all/{*pageRoute}
, nilai PageRoute
diatur ke this/is/a/test
.
Garis miring dan segmen jalur yang diambil didekodekan. Untuk templat rute /catch-all/{*pageRoute}
, URL /catch-all/this/is/a%2Ftest%2A
menghasilkan this/is/a/test*
.
URI dan alat bantu status navigasi
Gunakan NavigationManager untuk mengelola URI dan navigasi dalam kode C#. NavigationManager menyediakan peristiwa dan metode yang diperlihatkan dalam tabel berikut.
Anggota | Deskripsi |
---|---|
Uri | Mendapatkan URI absolut yang sedang digunakan saat ini. |
BaseUri | Mendapatkan URI dasar (dengan garis miring di akhir) yang dapat ditambahkan di depan path URI relatif untuk menghasilkan URI absolut. Biasanya, BaseUri sesuai dengan href atribut pada elemen dokumen <base> (lokasi <head> konten). |
NavigateTo | Menavigasi ke URI yang ditentukan. Jika forceLoad adalah false :
forceLoad adalah true :
Untuk informasi selengkapnya, lihat bagian Navigasi dan penanganan formulir yang disempurnakan. Jika |
LocationChanged | Sebuah peristiwa yang terjadi saat lokasi navigasi telah berubah. Untuk informasi selengkapnya, lihat bagian Perubahan lokasi. |
NotFound |
Dipanggil untuk menangani skenario di mana sumber daya yang diminta tidak ditemukan. Untuk informasi selengkapnya, lihat bagian Respons Tidak Ditemukan . |
ToAbsoluteUri | Mengonversi URI relatif menjadi URI absolut. |
ToBaseRelativePath | Berdasarkan URI dasar aplikasi, mengonversi URI absolut menjadi URI relatif terhadap awalan URI dasar. Misalnya, lihat bagian Menghasilkan URI relatif terhadap awalan URI dasar. |
RegisterLocationChangingHandler |
Mendaftarkan handler untuk menangani peristiwa navigasi masuk. Panggilan NavigateTo selalu memanggil handler. |
GetUriWithQueryParameter | Mengembalikan URI yang dibangun dengan memperbarui NavigationManager.Uri dengan parameter tunggal yang ditambahkan, diperbarui, atau dihapus. Untuk informasi selengkapnya, lihat bagian String kueri . |
Anggota | Deskripsi |
---|---|
Uri | Mendapatkan URI absolut yang sedang digunakan saat ini. |
BaseUri | Mendapatkan URI dasar (dengan garis miring di akhir) yang dapat ditambahkan di depan path URI relatif untuk menghasilkan URI absolut. Biasanya, BaseUri sesuai dengan href atribut pada elemen dokumen <base> (lokasi <head> konten). |
NavigateTo | Menavigasi ke URI yang ditentukan. Jika forceLoad adalah false :
forceLoad adalah true :
Untuk informasi selengkapnya, lihat bagian Navigasi dan penanganan formulir yang disempurnakan. Jika |
LocationChanged | Sebuah peristiwa yang terjadi saat lokasi navigasi telah berubah. Untuk informasi selengkapnya, lihat bagian Perubahan lokasi. |
ToAbsoluteUri | Mengonversi URI relatif menjadi URI absolut. |
ToBaseRelativePath | Berdasarkan URI dasar aplikasi, mengonversi URI absolut menjadi URI relatif terhadap awalan URI dasar. Misalnya, lihat bagian Menghasilkan URI relatif terhadap awalan URI dasar. |
RegisterLocationChangingHandler |
Mendaftarkan handler untuk menangani peristiwa navigasi masuk. Panggilan NavigateTo selalu memanggil handler. |
GetUriWithQueryParameter | Mengembalikan URI yang dibangun dengan memperbarui NavigationManager.Uri dengan parameter tunggal yang ditambahkan, diperbarui, atau dihapus. Untuk informasi selengkapnya, lihat bagian String kueri . |
Anggota | Deskripsi |
---|---|
Uri | Mendapatkan URI absolut yang sedang digunakan saat ini. |
BaseUri | Mendapatkan URI dasar (dengan garis miring di akhir) yang dapat ditambahkan di depan path URI relatif untuk menghasilkan URI absolut. Biasanya, BaseUri sesuai dengan href atribut pada elemen dokumen <base> (lokasi <head> konten). |
NavigateTo | Menavigasi ke URI yang ditentukan. Jika forceLoad adalah true :
replace adalah true , URI saat ini dalam riwayat browser diganti alih-alih mendorong URI baru ke tumpukan riwayat. |
LocationChanged | Sebuah peristiwa yang terjadi saat lokasi navigasi telah berubah. Untuk informasi selengkapnya, lihat bagian Perubahan lokasi. |
ToAbsoluteUri | Mengonversi URI relatif menjadi URI absolut. |
ToBaseRelativePath | Berdasarkan URI dasar aplikasi, mengonversi URI absolut menjadi URI relatif terhadap awalan URI dasar. Misalnya, lihat bagian Menghasilkan URI relatif terhadap awalan URI dasar. |
RegisterLocationChangingHandler |
Mendaftarkan handler untuk menangani peristiwa navigasi masuk. Panggilan NavigateTo selalu memanggil handler. |
GetUriWithQueryParameter | Mengembalikan URI yang dibangun dengan memperbarui NavigationManager.Uri dengan parameter tunggal yang ditambahkan, diperbarui, atau dihapus. Untuk informasi selengkapnya, lihat bagian String kueri . |
Anggota | Deskripsi |
---|---|
Uri | Mendapatkan URI absolut yang sedang digunakan saat ini. |
BaseUri | Mendapatkan URI dasar (dengan garis miring di akhir) yang dapat ditambahkan di depan path URI relatif untuk menghasilkan URI absolut. Biasanya, BaseUri sesuai dengan href atribut pada elemen dokumen <base> (lokasi <head> konten). |
NavigateTo | Menavigasi ke URI yang ditentukan. Jika forceLoad adalah true :
replace adalah true , URI saat ini dalam riwayat browser diganti alih-alih mendorong URI baru ke tumpukan riwayat. |
LocationChanged | Sebuah peristiwa yang terjadi saat lokasi navigasi telah berubah. Untuk informasi selengkapnya, lihat bagian Perubahan lokasi. |
ToAbsoluteUri | Mengonversi URI relatif menjadi URI absolut. |
ToBaseRelativePath | Berdasarkan URI dasar aplikasi, mengonversi URI absolut menjadi URI relatif terhadap awalan URI dasar. Misalnya, lihat bagian Menghasilkan URI relatif terhadap awalan URI dasar. |
GetUriWithQueryParameter | Mengembalikan URI yang dibangun dengan memperbarui NavigationManager.Uri dengan parameter tunggal yang ditambahkan, diperbarui, atau dihapus. Untuk informasi selengkapnya, lihat bagian String kueri . |
Anggota | Deskripsi |
---|---|
Uri | Mendapatkan URI absolut yang sedang digunakan saat ini. |
BaseUri | Mendapatkan URI dasar (dengan garis miring di akhir) yang dapat ditambahkan di depan path URI relatif untuk menghasilkan URI absolut. Biasanya, BaseUri sesuai dengan href atribut pada elemen dokumen <base> (lokasi <head> konten). |
NavigateTo | Menavigasi ke URI yang ditentukan. Jika forceLoad adalah true :
|
LocationChanged | Sebuah peristiwa yang terjadi saat lokasi navigasi telah berubah. |
ToAbsoluteUri | Mengonversi URI relatif menjadi URI absolut. |
ToBaseRelativePath | Berdasarkan URI dasar aplikasi, mengonversi URI absolut menjadi URI relatif terhadap awalan URI dasar. Misalnya, lihat bagian Menghasilkan URI relatif terhadap awalan URI dasar. |
Perubahan lokasi
Untuk acara
- Location: URL lokasi baru.
-
IsNavigationIntercepted: Jika
true
, Blazor mencegat navigasi dari browser. Jikafalse
, NavigationManager.NavigateTo menyebabkan terjadinya navigasi.
Komponen berikut:
- Navigasi ke komponen aplikasi
Counter
(Counter.razor
) saat tombol dipilih menggunakan NavigateTo. - Menangani peristiwa lokasi yang berubah dengan berlangganan ke NavigationManager.LocationChanged.
Metode
HandleLocationChanged
ini dilepaskan ketikaDispose
dipanggil oleh kerangka kerja. Melepas kait metode memungkinkan pengumpulan sampah komponen.Implementasi pencatat mencatat informasi berikut saat tombol dipilih:
BlazorSample.Pages.Navigate: Information: URL of new location: https://localhost:{PORT}/counter
Navigate.razor
:
@page "/navigate"
@implements IDisposable
@inject ILogger<Navigate> Logger
@inject NavigationManager Navigation
<PageTitle>Navigate</PageTitle>
<h1>Navigate Example</h1>
<button class="btn btn-primary" @onclick="NavigateToCounterComponent">
Navigate to the Counter component
</button>
@code {
private void NavigateToCounterComponent() => Navigation.NavigateTo("counter");
protected override void OnInitialized() =>
Navigation.LocationChanged += HandleLocationChanged;
private void HandleLocationChanged(object? sender, LocationChangedEventArgs e) =>
Logger.LogInformation("URL of new location: {Location}", e.Location);
public void Dispose() => Navigation.LocationChanged -= HandleLocationChanged;
}
@page "/navigate"
@implements IDisposable
@inject ILogger<Navigate> Logger
@inject NavigationManager Navigation
<PageTitle>Navigate</PageTitle>
<h1>Navigate Example</h1>
<button class="btn btn-primary" @onclick="NavigateToCounterComponent">
Navigate to the Counter component
</button>
@code {
private void NavigateToCounterComponent() => Navigation.NavigateTo("counter");
protected override void OnInitialized() =>
Navigation.LocationChanged += HandleLocationChanged;
private void HandleLocationChanged(object? sender, LocationChangedEventArgs e) =>
Logger.LogInformation("URL of new location: {Location}", e.Location);
public void Dispose() => Navigation.LocationChanged -= HandleLocationChanged;
}
@page "/navigate"
@using Microsoft.Extensions.Logging
@implements IDisposable
@inject ILogger<Navigate> Logger
@inject NavigationManager Navigation
<h1>Navigate in component code example</h1>
<button class="btn btn-primary" @onclick="NavigateToCounterComponent">
Navigate to the Counter component
</button>
@code {
private void NavigateToCounterComponent()
{
Navigation.NavigateTo("counter");
}
protected override void OnInitialized()
{
Navigation.LocationChanged += HandleLocationChanged;
}
private void HandleLocationChanged(object? sender, LocationChangedEventArgs e)
{
Logger.LogInformation("URL of new location: {Location}", e.Location);
}
public void Dispose()
{
Navigation.LocationChanged -= HandleLocationChanged;
}
}
@page "/navigate"
@using Microsoft.Extensions.Logging
@implements IDisposable
@inject ILogger<Navigate> Logger
@inject NavigationManager Navigation
<h1>Navigate in component code example</h1>
<button class="btn btn-primary" @onclick="NavigateToCounterComponent">
Navigate to the Counter component
</button>
@code {
private void NavigateToCounterComponent()
{
Navigation.NavigateTo("counter");
}
protected override void OnInitialized()
{
Navigation.LocationChanged += HandleLocationChanged;
}
private void HandleLocationChanged(object? sender, LocationChangedEventArgs e)
{
Logger.LogInformation("URL of new location: {Location}", e.Location);
}
public void Dispose()
{
Navigation.LocationChanged -= HandleLocationChanged;
}
}
@page "/navigate"
@using Microsoft.Extensions.Logging
@implements IDisposable
@inject ILogger<Navigate> Logger
@inject NavigationManager Navigation
<h1>Navigate in component code example</h1>
<button class="btn btn-primary" @onclick="NavigateToCounterComponent">
Navigate to the Counter component
</button>
@code {
private void NavigateToCounterComponent()
{
Navigation.NavigateTo("counter");
}
protected override void OnInitialized()
{
Navigation.LocationChanged += HandleLocationChanged;
}
private void HandleLocationChanged(object sender, LocationChangedEventArgs e)
{
Logger.LogInformation("URL of new location: {Location}", e.Location);
}
public void Dispose()
{
Navigation.LocationChanged -= HandleLocationChanged;
}
}
@page "/navigate"
@using Microsoft.Extensions.Logging
@implements IDisposable
@inject ILogger<Navigate> Logger
@inject NavigationManager Navigation
<h1>Navigate in component code example</h1>
<button class="btn btn-primary" @onclick="NavigateToCounterComponent">
Navigate to the Counter component
</button>
@code {
private void NavigateToCounterComponent()
{
Navigation.NavigateTo("counter");
}
protected override void OnInitialized()
{
Navigation.LocationChanged += HandleLocationChanged;
}
private void HandleLocationChanged(object sender, LocationChangedEventArgs e)
{
Logger.LogInformation("URL of new location: {Location}", e.Location);
}
public void Dispose()
{
Navigation.LocationChanged -= HandleLocationChanged;
}
}
Untuk informasi selengkapnya tentang pembuangan komponen, lihat ASP.NET Core Razor pembuangan komponen.
Respons Tidak Ditemukan
Di .NET 10 Pratinjau 4, respons Tidak Ditemukan hanya tersedia untuk SSR statis dan penyajian interaktif global. Dukungan rendering per halaman/komponen direncanakan untuk Pratinjau 5 pada bulan Juni 2025.
NavigationManager menyediakan NotFound
metode untuk menangani skenario di mana sumber daya yang diminta tidak ditemukan selama penyajian sisi server statis (SSR statis) atau penyajian interaktif global:
-
SSR Statis: Panggilan
NotFound
mengatur kode status HTTP ke 404. - Penyajian streaming: Memberikan pengecualian jika respons telah dimulai.
-
Penyajian interaktif: Memberi sinyal router Blazor (
Router
komponen) untuk merender konten Tidak Ditemukan.
Ketika komponen dirender secara statis (SSR statis) dan NavigationManager.NotFound
dipanggil, kode status 404 diatur pada respons:
@page "/render-not-found-ssr"
@inject NavigationManager Navigation
@code {
protected override void OnInitialized()
{
Navigation.NotFound();
}
}
Untuk menyediakan konten Tidak Ditemukan untuk penyajian interaktif global, gunakan halaman Tidak Ditemukan (Razor komponen).
Catatan
Templat proyek Blazor menyertakan halaman NotFound.razor
secara bawaan. Halaman ini secara otomatis dirender setiap kali NavigationManager.NotFound
dipanggil, sehingga lebih mudah untuk menangani rute yang hilang dengan pengalaman pengguna yang konsisten.
NotFound.razor
:
<h1>Not Found</h1>
<p>Sorry! Nothing to show.</p>
Tetapkan NotFound
komponen ke parameter router NotFoundPage
.
NotFoundPage
mendukung perutean yang dapat diterapkan di seluruh middleware eksekusi ulang, termasuk middleware non-Blazor.
NotFound
Jika fragmen render didefinisikan bersama dengan NotFoundPage
, halaman memiliki prioritas yang lebih tinggi.
Dalam contoh berikut, komponen sebelumnya NotFound
ada di folder aplikasi Pages
dan diteruskan ke NotFoundPage
parameter :
<Router AppAssembly="@typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
</Router>
Ketika sebuah komponen dirender dengan mode render interaktif global, memanggil NotFound
menyampaikan sinyal ke router Blazor untuk merender komponen NotFound
.
@page "/render-not-found-interactive"
@inject NavigationManager Navigation
@if (RendererInfo.IsInteractive)
{
<button @onclick="TriggerNotFound">Trigger Not Found</button>
}
@code {
private void TriggerNotFound()
{
Navigation.NotFound();
}
}
Anda dapat menggunakan acara OnNotFound
untuk pemberitahuan saat NotFound
diaktifkan. Peristiwa ini hanya diaktifkan ketika NotFound
dipanggil, bukan untuk respons 404. Misalnya, pengaturan HttpContextAccessor.HttpContext.Response.StatusCode
ke 404
tidak memicu NotFound
/OnNotFound
.
Dalam contoh berikut untuk komponen yang mengadopsi penyajian sisi server interaktif (SSR interaktif), konten kustom dirender tergantung di mana OnNotFound
dipanggil. Jika peristiwa dipicu oleh komponen berikut Movie
saat film tidak ditemukan pada inisialisasi komponen, pesan kustom menyatakan bahwa film yang diminta tidak ditemukan. Jika peristiwa dipicu oleh User
komponen, pesan yang berbeda menyatakan bahwa pengguna tidak ditemukan.
Layanan berikut NotFoundContext
mengelola konteks dan pesan saat konten tidak ditemukan oleh komponen.
NotFoundContext.cs
:
public class NotFoundContext
{
public string Heading { get; private set; } = "Not Found";
public string Message { get; private set; } =
"Sorry, the page that you requested couldn't be found.";
public void UpdateContext(string heading, string message)
{
Heading = heading;
Message = message;
}
}
Layanan ini terdaftar dalam file sisi Program
server:
builder.Services.AddScoped<NotFoundContext>();
Komponen Routes
(Routes.razor
):
- Menyuntikkan
NotFoundContext
layanan. - Menampilkan judul (
Heading
) dan pesan (Message
) ketikaOnNotFound
dipicu oleh panggilan keNotFound
.
@inject NotFoundContext NotFoundContext
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
<FocusOnNavigate RouteData="routeData" Selector="h1" />
</Found>
<NotFound>
<LayoutView Layout="typeof(Layout.MainLayout)">
<h1>@NotFoundContext.Heading</h1>
<div>
<p>@NotFoundContext.Message</p>
</div>
</LayoutView>
</NotFound>
</Router>
Dalam contoh komponen berikut:
- Layanan
NotFoundContext
diintegrasikan, bersama dengan NavigationManager. - Di OnInitializedAsync,
HandleNotFound
adalah penanganan aktivitas yang ditetapkan keOnNotFound
peristiwa.HandleNotFound
memanggilNotFoundContext.UpdateContext
untuk menetapkan judul dan pesan untuk konten 'Tidak Ditemukan' yang ditampilkan oleh komponenRouter
dalam komponenRoutes
(Routes.razor
). - Komponen biasanya menggunakan ID dari parameter rute untuk memperoleh informasi film atau pengguna dari sumber data, seperti database. Dalam contoh berikut, tidak ada entitas yang dikembalikan (
null
) untuk mensimulasikan apa yang terjadi ketika entitas tidak ditemukan. - Ketika tidak ada entitas yang dikembalikan ke OnInitializedAsync,
NavigationManager.NotFound
dipanggil, yang pada gilirannya memicuOnNotFound
event danHandleNotFound
event handler. Pesan Tidak Ditemukan ditampilkan oleh router. - Metode
HandleNotFound
ini tidak terkait pada pembuangan komponen di IDisposable.Dispose.
Movie
komponen (Movie.razor
):
@page "/movie/{Id:int}"
@implements IDisposable
@inject NavigationManager NavigationManager
@inject NotFoundContext NotFoundContext
<div>
No matter what ID is used, no matching movie is returned
from the call to GetMovie().
</div>
@code {
[Parameter]
public int Id { get; set; }
protected override async Task OnInitializedAsync()
{
NavigationManager.OnNotFound += HandleNotFound;
var movie = await GetMovie(Id);
if (movie == null)
{
NavigationManager.NotFound();
}
}
private void HandleNotFound(object? sender, NotFoundEventArgs e)
{
NotFoundContext.UpdateContext("Movie Not Found",
"Sorry! The requested movie wasn't found.");
}
private async Task<MovieItem[]?> GetMovie(int id)
{
// Simulate no movie with matching id found
return await Task.FromResult<MovieItem[]?>(null);
}
void IDisposable.Dispose()
{
NavigationManager.OnNotFound -= HandleNotFound;
}
public class MovieItem
{
public int Id { get; set; }
public string? Title { get; set; }
}
}
User
komponen (User.razor
):
@page "/user/{Id:int}"
@implements IDisposable
@inject NavigationManager NavigationManager
@inject NotFoundContext NotFoundContext
<div>
No matter what ID is used, no matching user is returned
from the call to GetUser().
</div>
@code {
[Parameter]
public int Id { get; set; }
protected override async Task OnInitializedAsync()
{
NavigationManager.OnNotFound += HandleNotFound;
var user = await GetUser(Id);
if (user == null)
{
NavigationManager.NotFound();
}
}
private void HandleNotFound(object? sender, NotFoundEventArgs e)
{
NotFoundContext.UpdateContext("User Not Found",
"Sorry! The requested user wasn't found.");
}
private async Task<UserItem[]?> GetUser(int id)
{
// Simulate no user with matching id found
return await Task.FromResult<UserItem[]?>(null);
}
void IDisposable.Dispose()
{
NavigationManager.OnNotFound -= HandleNotFound;
}
public class UserItem
{
public int Id { get; set; }
public string? Name { get; set; }
}
}
Untuk mencapai komponen pendahuluan dalam demonstrasi lokal menggunakan aplikasi pengujian, buat entri pada komponen NavMenu
(NavMenu.razor
) untuk menjangkau komponen Movie
dan User
. ID entitas, yang diteruskan sebagai parameter rute, dalam contoh berikut adalah nilai semu yang tidak berpengaruh karena tidak benar-benar digunakan oleh komponen, yang mensimulasikan ketidakberhasilan menemukan film atau pengguna.
Dalam NavMenu.razor
:
<div class="nav-item px-3">
<NavLink class="nav-link" href="movie/1">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Movie
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="user/2">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> User
</NavLink>
</div>
Navigasi dan penanganan formulir yang disempurnakan
Bagian ini berlaku untuk Blazor Web Apps.
Blazor Web Apps mampu melakukan dua jenis perutean untuk navigasi halaman dan permintaan penanganan formulir.
- Navigasi normal (navigasi lintas dokumen): pemuatan ulang halaman penuh dipicu untuk URL permintaan.
- Navigasi yang ditingkatkan (navigasi dokumen yang sama): Blazor mencegat permintaan dan melakukan permintaan
fetch
sebagai gantinya. Blazor lalu patch konten respons ke dalam DOM halaman. BlazorNavigasi dan penanganan formulir yang disempurnakan menghindari kebutuhan untuk memuat ulang halaman penuh dan mempertahankan lebih banyak status halaman, sehingga halaman dimuat lebih cepat, biasanya tanpa kehilangan posisi gulir pengguna di halaman.
Navigasi yang ditingkatkan tersedia ketika:
ASP.NET Core