路由約束
類型約束
我們這里使用{id:int}限制路由,id為int類型,并且路由參數 id 對應的 Id 屬性也必須是 int 類型。我們試試能否正常訪問
@page "/demoPage/{id:int}"
<h3>demoPage</h3>
<h2>路由參數Id:@Id</h2>
@code {[Parameter]public int Id { get; set; }
}
int類型路由可以正常訪問
使用字符串無法訪問到該路由
常見類型約束
函數約束
路由模板中,可以執行函數,用來驗證路由參數值是否符合約束要求。
我們在這里為id添加了約束{id:max(100)}
@page "/demoPage/{id:max(100)}"
<h3>demoPage</h3>
<h2>路由參數Id:@Id</h2>
@code {[Parameter]public int Id { get; set; }
}
運行結果
運行后我們發現發生了報錯,這是因為
使用@page 指令指定路由模板,則所有函數約束所應用的路由參數必須是 string 類型,框架不提供強制自動轉換。
我們修改為string試試效果如何
@page "/demoPage/{id:max(100)}"
<h3>demoPage</h3>
<h2>路由參數Id:@Id</h2>
@code {[Parameter] public string Id { get; set; } = null!;
}
這次運行正常了,并且超出路由限制的無法訪問
catch-all 路由
@page "/demoPage/{*AnyRoute}"
<h3>demoPage</h3>
<h2>路由參數:@AnyRoute</h2>
@code {[Parameter] public string? AnyRoute { get; set; }
}
定義的 AnyRoute 參數屬性為任意路由參數,必須為 string 類型。
在路由模板中,要在任意路由參數前面使用 * 通配符,并放在{}內,如{*AnyRoute}。
獲取路由查詢參數
當路由中攜帶查詢參數時,如路由/demoPage?a=abc&b=4
,遇到這類參數時,我們需要使用[SupplyParameterFromQuery]
特性標記變量來獲取參數
@page "/demoPage"
<h3>demoPage</h3>
<h2>路由查詢參數:@A</h2>
<h2>路由查詢參數:@B</h2>
@code {[SupplyParameterFromQuery] public string? A { get; set; }[SupplyParameterFromQuery] public string? B { get; set; }
}
如上的方式就可以獲取參數a,b的值
查詢參數別名
我們還可以通過設置別名的方式,對查詢參數進行獲取,以應對參數查詢名稱和我們想聲明的變量名稱不一致的情況。
這樣的方式我們仍然可以讀取到參數
@page "/demoPage"
<h3>demoPage</h3>
<h2>路由查詢參數:@Parameter</h2>
<h2>路由查詢參數:@B</h2>
@code {[SupplyParameterFromQuery(Name = "a")] public string? Parameter { get; set; }[SupplyParameterFromQuery] public string? B { get; set; }
}
數組查詢參數
我們將參數直接使用數組進行接收即可,如下
@page "/demoPage"
<h3>demoPage</h3>
<h2>路由查詢參數:</h2>
@if (Parameter is not null)
{<ul>@foreach (var item in Parameter){<p>@item</p>}</ul>}
<h2>路由查詢參數:@B</h2>
@code {[SupplyParameterFromQuery(Name = "a")] public string[]? Parameter { get; set; }[SupplyParameterFromQuery] public string? B { get; set; }
}