在 Blazor 中获取当前 URL 里的参数(查询字符串),主要有以下几种方法:

方法 1:使用 NavigationManagerQueryHelpers(推荐)

这是最常用的方法,适用于 .NET 5+ 版本。

  1. 注入 NavigationManager 服务
  2. 使用 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"


关键点说明:

  1. 依赖注入:必须注入 NavigationManager

    @inject NavigationManager NavigationManager
  2. 解析工具包

    <!-- 项目文件添加包引用 -->
    <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0+" />
  3. 特殊字符处理

    • 使用 Uri.UnescapeDataString() 解码 URL 编码值(如 %20 → 空格)
    • 处理多值参数(示例中只取第一个值):

      // 获取多值参数的第一个值
      parameters = query.ToDictionary(
          k => k.Key,
          v => Uri.UnescapeDataString(v.Value[0] ?? "")
      );
  4. 生命周期

    • 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(需手动处理边缘情况)

标签: none