原文鏈接:https://blazor-university.com/routing/route-parameters/
路由參數
源代碼[1]
到目前為止,我們已經了解了如何將靜態 URL 鏈接到 Blazor 組件。靜態 URL 只對靜態內容有用,如果我們希望同一個組件根據 URL 中的信息(例如客戶 ID)呈現不同的視圖,那么我們需要使用路由參數。
在添加組件的 @page
聲明時,通過將其名稱包裝在一對 {
大括號 }
中來在 URL 中定義路由參數。
@page?"/customer/{CustomerId}
捕獲參數值
捕獲參數的值就像添加具有相同名稱的屬性并用 [Parameter]
屬性裝飾它一樣簡單。
@page?"/"
@page?"/customer/{CustomerId}"<h1>Customer:@if?(string.IsNullOrEmpty(CustomerId)){@:None}else{@CustomerId}
</h1>
<h3>Select?a?customer</h3>
<ul><li><a?href="/customer/Microsoft">Microsoft</a></li><li><a?href="/customer/Google">Google</a></li><li><a?href="/customer/IBM">IBM</a></li>
</ul>@code?{[Parameter]public?string?CustomerId?{?get;?set;?}
}
請注意,當導航到解析為與當前頁面相同類型的組件的新 URL 時,組件不會在導航之前被銷毀,并且不會執行 OnInitialized*
生命周期方法。導航被簡單地視為對組件參數的更改。
路由參數約束
源代碼[2]
除了能夠指定包含參數的 URL 模板外,還可以確保 Blazor 僅在參數值滿足特定條件時才將 URL 與組件匹配。
例如,在采購訂單編號始終為整數的應用程序中,我們希望 URL 中的參數與我們的組件相匹配,以便僅當 OrderNumber
的 URL 值實際上是一個數字時才顯示采購訂單。
要為參數定義約束,它以冒號后綴,然后是約束類型。例如 :int
只會匹配在正確的位置包含一個有效的整數值的 URL。
@page?"/"
@page?"/purchase-order/{OrderNumber:int}"<h1>Order?number:@if?(!OrderNumber.HasValue){@:None}else{@OrderNumber}
</h1>
<h3>Select?a?purchase?order</h3>
<ul><li><a?href="/purchase-order/1/">Order?1</a></li><li><a?href="/purchase-order/2/">Order?2</a></li><li><a?href="/purchase-order/42/">Order?42</a></li>
</ul>@code?{[Parameter]public?int??OrderNumber?{?get;?set;?}
}
約束類型
約束 | .NET 類型 | 有效值 | 無效值 |
---|---|---|---|
:bool | System.Boolean | true false | 1 Hello |
:datetime | System.DateTime | 2001-01-01 02-29-2000 | 29-02-2000 |
:decimal | System.Decimal | 2.34 0.234 | 2,34 ?.??? |
:double | System.Double | 2.34 ?0.234 | 2,34 ?.??? |
:float | System.Single | 2.34 0.234 | 2,34 ?.??? |
:guid | System.Guid | 99303dc9-8c76-42d9-9430-de3ee1ac25d0 | {99303dc9-8c76-42d9-9430-de3ee1ac25d0} |
:int | System.Int32 | -1 42 299792458 | 12.34 ?? |
:long | System.Int64 | -1 42 299792458 | 12.34 ?? |
本地化
Blazor 約束當前不支持本地化。
數字只有在
0..9
的形式下才被認為是有效的,而不是來自非英語語言,例如?..?
(古吉拉特語)。日期僅以
MM-dd-yyyy
、MM-dd-yy
或 ISO 格式yyyy-MM-dd
的形式有效。布爾值必須為
true
或false
。
不支持的約束類型
Blazor 約束不支持以下約束類型,但希望將來會支持:
貪心參數
在 ASP.NET MVC 中,可以提供一個以星號開頭的參數名稱,并捕獲包括正斜杠在內的 URL 塊。
/articles/{Subject}/{*TheRestOfTheURL}
正則表達式
Blazor 當前不支持基于正則表達式約束參數的能力。
枚舉
目前不可能約束參數以匹配枚舉的值。
自定義約束
無法定義自定義類來確定傳遞給參數的值是否有效。
參考資料
[1]
源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/Routing/CapturingAParameterValue
[2]源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/Routing/ConstrainingRouteParameters