在Blazor应用开发中,获取URL查询字符串参数是非常常见的需求,比如从列表页跳转到详情页时传递ID,或者传递筛选条件等场景都需要用到这个功能。Blazor提供了对应的内置服务和方法,能够方便地完成参数提取操作。

使用NavigationManager获取查询字符串
Blazor内置的NavigationManager服务提供了访问当前URL的能力,我们可以通过它拿到完整的URL,再手动解析查询字符串部分。首先需要在组件中注入NavigationManager。
@using Microsoft.AspNetCore.Components
@inject NavigationManager NavigationManager
@code {
private string? GetQueryString()
{
// 获取当前完整的URI
var uri = new Uri(NavigationManager.Uri);
// 返回查询字符串部分,包含开头的?,如果没有查询字符串则返回空字符串
return uri.Query;
}
}
上面的代码可以拿到完整的查询字符串,比如当前URL是/user?id=1&name=test,那么uri.Query的返回值就是?id=1&name=test。
解析单个查询参数
拿到查询字符串之后,我们需要进一步解析出具体的参数值。可以使用System.Web命名空间下的HttpUtility类来解析,不过需要注意在Blazor WebAssembly项目中需要额外引用对应的包,Blazor Server项目则可以直接使用。
如果不想依赖额外的解析类,也可以手动处理查询字符串:
@using Microsoft.AspNetCore.Components
@inject NavigationManager NavigationManager
@code {
private string? GetQueryParamValue(string paramName)
{
var uri = new Uri(NavigationManager.Uri);
// 如果没有查询字符串,直接返回null
if (string.IsNullOrEmpty(uri.Query))
{
return null;
}
// 去掉开头的?,再按&分割参数
var queryParams = uri.Query.TrimStart('?').Split('&');
foreach (var param in queryParams)
{
var keyValue = param.Split('=');
// 匹配参数名,返回对应的值
if (keyValue.Length == 2 && keyValue[0] == paramName)
{
return Uri.UnescapeDataString(keyValue[1]);
}
}
return null;
}
}
调用GetQueryParamValue("id")就可以拿到URL中id参数对应的值,如果参数不存在则返回null。这里使用Uri.UnescapeDataString是为了处理参数值中包含的特殊字符,比如中文、空格等经过编码的内容。
使用QueryHelpers解析多个参数
如果项目中需要频繁解析查询参数,手动处理会比较繁琐,微软提供了Microsoft.AspNetCore.WebUtilities包中的QueryHelpers类,可以更高效地解析查询参数。首先需要在项目中安装对应的NuGet包,然后就可以直接调用方法解析。
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavigationManager
@code {
private Dictionary<string, string> GetAllQueryParams()
{
var uri = new Uri(NavigationManager.Uri);
// 解析所有查询参数到字典中
var queryParams = QueryHelpers.ParseQuery(uri.Query);
// 转换为普通的字典返回,注意ParseQuery返回的是StringValues类型
return queryParams.ToDictionary(k => k.Key, k => k.Value.ToString());
}
}
这个方法会返回所有查询参数的键值对字典,即使同一个参数出现多次,也会被合并处理。如果同一个参数有多个值,queryParams[k.Key]会返回所有值的集合,可以根据实际需求调整处理逻辑。
在组件初始化时获取参数
通常我们需要在组件加载完成时就获取到查询参数,这时候可以在OnInitializedAsync或者OnParametersSetAsync生命周期方法中调用参数获取的逻辑。
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavigationManager
<h3>当前用户ID:@UserId</h3>
@code {
private string? UserId { get; set; }
protected override void OnInitialized()
{
var uri = new Uri(NavigationManager.Uri);
var queryParams = QueryHelpers.ParseQuery(uri.Query);
if (queryParams.ContainsKey("id"))
{
UserId = queryParams["id"];
}
}
}
当页面URL为/user?id=1001时,组件渲染后就会显示当前用户ID:1001。如果URL中没有id参数,UserId会保持null,页面显示对应内容为空。
监听查询参数变化
如果用户在同一个页面内修改URL的查询参数,比如通过浏览器的前进后退按钮,或者代码修改URL,组件默认不会重新获取参数。这时候可以监听NavigationManager的LocationChanged事件,在URL变化时重新解析参数。
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavigationManager
@code {
private string? CurrentParam { get; set; }
protected override void OnInitialized()
{
// 初始加载时获取参数
ParseQueryParams();
// 注册URL变化监听事件
NavigationManager.LocationChanged += (sender, e) =>
{
ParseQueryParams();
// 通知组件重新渲染
InvokeAsync(StateHasChanged);
};
}
private void ParseQueryParams()
{
var uri = new Uri(NavigationManager.Uri);
var queryParams = QueryHelpers.ParseQuery(uri.Query);
if (queryParams.ContainsKey("type"))
{
CurrentParam = queryParams["type"];
}
}
}
这样当用户修改URL中的查询参数时,组件会自动更新对应的参数值并重新渲染,保证页面展示的内容始终和当前URL匹配。
注意事项
- 查询参数的值如果包含特殊字符,URL会自动进行编码,解析的时候一定要使用
Uri.UnescapeDataString进行解码,否则会得到乱码内容。 - 如果同一个查询参数出现多次,比如
?tag=blazor&tag=dotnet,使用QueryHelpers.ParseQuery解析后,对应的值会是包含所有值的集合,需要根据业务场景处理是取第一个值还是合并所有值。 - 在Blazor WebAssembly项目中,
NavigationManager.Uri获取的是客户端的当前URL,和服务器端的请求URL无关,不需要额外处理跨域或者服务器端路由的问题。
BlazorURL查询字符串NavigationManager查询参数解析Blazor组件修改时间:2026-07-03 00:36:28