在 Blazor 中获取当前 URL 里的参数(查询字符串),主要有以下几种方法
在 Blazor 中获取当前 URL 里的参数(查询字符串),主要有以下几种方法:
方法 1:使用 NavigationManager
和 QueryHelpers
(推荐)
这是最常用的方法,适用于 .NET 5+ 版本。
- 注入
NavigationManager
服务 - 使用
Microsoft.AspNetCore.WebUtilities
解析查询字符串
@page "/"
@inject NavigationManager NavigationManager
@using Microsoft.AspNetCore.WebUtilities
<h1>URL 参数:</h1>
@if (parameters != null)
{
<ul>
@foreach (var param in parameters)
{
<li>@param.Key: @param.Value</li>
}
</ul>
}
@code {
private Dictionary<string, string>? parameters;
protected override void OnInitialized()
{
// 获取当前 URI
var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
// 解析查询参数
var query = QueryHelpers.ParseQuery(uri.Query);
// 转换为字典(处理单值参数)
parameters = query.ToDictionary(
k => k.Key,
v => Uri.UnescapeDataString(v.Value.ToString())
);
}
}
方法 2:手动解析查询字符串(基础方法)
如果不想引用额外包,可手动解析:
protected override void OnInitialized()
{
var uri = new Uri(NavigationManager.Uri);
var query = uri.Query.TrimStart('?');
parameters = new Dictionary<string, string>();
foreach (var pair in query.Split('&'))
{
var parts = pair.Split('=');
if (parts.Length == 2)
{
parameters[parts[0]] = Uri.UnescapeDataString(parts[1]);
}
}
}
方法 3:.NET 7+ 使用 [SupplyParameterFromQuery]
(直接绑定参数)
.NET 7 或更高版本 支持自动绑定查询参数:
@page "/"
<h3>参数值: @UserName</h3>
@code {
[SupplyParameterFromQuery(Name = "username")]
public string? UserName { get; set; }
}
访问 URL:https://yoursite.com/?username=JohnDoe
会自动绑定 UserName = "JohnDoe"
关键点说明:
依赖注入:必须注入
NavigationManager
@inject NavigationManager NavigationManager
解析工具包:
<!-- 项目文件添加包引用 --> <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0+" />
特殊字符处理:
- 使用
Uri.UnescapeDataString()
解码 URL 编码值(如%20
→ 空格) 处理多值参数(示例中只取第一个值):
// 获取多值参数的第一个值 parameters = query.ToDictionary( k => k.Key, v => Uri.UnescapeDataString(v.Value[0] ?? "") );
- 使用
生命周期:
- 在
OnInitialized()
或OnParametersSet()
中获取参数 监听导航事件:
NavigationManager.LocationChanged += (sender, e) => { // URL变化时重新解析 };
- 在
完整示例(获取单个参数):
@page "/user"
@inject NavigationManager NavManager
<p>用户ID: @UserId</p>
@code {
private string? UserId;
protected override void OnInitialized()
{
var uri = NavManager.ToAbsoluteUri(NavManager.Uri);
if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("id", out var id))
{
UserId = id.FirstOrDefault(); // 获取第一个值
}
}
}
访问 URL:https://yoursite.com/user?id=12345
选择方法时:
- 推荐使用 方法 1(灵活,支持复杂参数)
- 简单场景用 方法 3(.NET 7+ 最简洁)
- 避免 方法 2(需手动处理边缘情况)