Blazor入手教程(四)路由
路由
路由
而Blazor中使用 @page “url路徑” 來表示路由地址,比如/counter,那么該頁面的請求地址就是域名:端口號/counter

更深層次也很簡單

Vue工程一般使用一個獨立的文件route.js來統一管理配置路由。在這一點上,Blazor較為省事,而vue控制性較強。
一般在app.razor文件可以看到路由視圖的定義,這個稱之為路由模板,當找到相匹配的視圖時,會在<Found></Found>節點里面渲染出來,如果沒有的話會在<NotFound></NotFound>節點里面渲染,當然你也可以自定義一個404的頁面。里面的DefaultLayout表示默認布局組件,Layout表示指定的布局組件,這些會在后面你的Layout里面講到

路由參數
設置路由參數只需要兩步就可以設置路由參數
1,在@page 后面的url中使用{路由參數名}的占位符格式標明
2,在@code里面申名一個帶有[Parameter]特性的屬性,這里是不分大小寫的,Keyword也可以獲取到


@page "/RouteParameter/{keyword}"
<h3>路有參數</h3>
@code {
[Parameter]
public string keyword { get; set; }
protected override void OnInitialized()
{
Console.WriteLine("keyword=" + keyword);
}
}
值得注意的是,當我們的路由參數缺失的時候,他會認為這個我們定義的路由不匹配。所以也就不會渲染這個頁面。

路由約束
{路有參數名:參數類型} 表示路由約束,可以限定參數的類型,當參數類型不匹配時

假設我們這里的keyword傳入的是123a,轉換成int時會失敗,他這里就找不到這個參數

@page "/RouteParameterConstraints/{keyword:int}"
<h3>路由約束</h3>
@code {
[Parameter]
public int keyword { get; set; }
protected override void OnInitialized()
{
Console.WriteLine("keyword=" + keyword);
}
}
獲取查詢字符串
Vue中可以使用 this.$route.query.參數名來獲取查詢參數值
而Blazor使用NavigationManager.Uri這個對象來獲取查詢參數


@page "/querystring"
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavigationManager
<h3>查詢字符串</h3>
<p>keyword Value: @keyword</p>
<p>state Value: @state</p>
@code {
private string keyword = "";
private string state = "0";
protected override void OnInitialized()
{
var query = new Uri(NavigationManager.Uri).Query;
Console.WriteLine("query=" + query);
if (QueryHelpers.ParseQuery(query).TryGetValue("keyword", out var keyword))
{
Console.WriteLine("keyword=" + keyword);
}
if (QueryHelpers.ParseQuery(query).TryGetValue("state", out var state))
{
Console.WriteLine("state=" + state);
}
}
}
這里就可以獲取到整個的查詢字符串。
當然,更常見的情況是需要解析出每個參數的key和value。你可以自己手動編寫一個解析查詢參數的方法,或者使用微軟官方提供的一個工具包Microsoft.AspNetCore.WebUtilities中提供的方法。可以在nuget上安裝。

安裝完成后,引入命名空間,使用QueryHelpers.ParseQuery()方法就可以轉換參數

結果

NavLink和a標簽
Vue中有自帶的<route-link></route-link>組件來渲染a標簽
而 Blazor中有個NavLink組件。功能基本一致。他們最終會渲染成a標簽。
不過NavLink組件提供了一個Match的參數,可以根據當前的url來匹配。 如果當前頁面的url和該標簽的href匹配,會給他追加上一個 active的class。而且這個匹配有兩種可供選擇,NavLinkMatch.Prefix(匹配前綴), NavLinkMatch.All(匹配全部)


相關代碼
@page "/navlinkanda"
<h3>NavLink和a標簽</h3>
<NavLink href="http://www.baidu.com">鏈接到外部地址</NavLink>
<NavLink href="/querystring?keyword=abc&state=1">連接到站內地址</NavLink>
<NavLink href="/navlinkanda" Match="NavLinkMatch.Prefix">匹配前綴</NavLink>
<NavLink href="/navlinkanda?k=123" Match="NavLinkMatch.All">匹配全部</NavLink>
@code {
}
