【问题标题】:Multiple query string parameters in Blazor routingBlazor 路由中的多个查询字符串参数
【发布时间】:2019-05-16 02:46:18
【问题描述】:

我当前的项目中有多个从 url 检索 1 个查询参数的工作示例,但是当尝试对多个 url 参数遵循相同的约定时,我在 chrome 调试器控制台中收到以下错误:

Error: System.InvalidOperationException: 'Router' cannot find any component with a route for '/confirmemail'.

我的页面路由定义为:

@page "/confirmemail/{Token}/{UserId}"

@functions{...} 部分包含以下属性:

[Parameter]
string Token { get; set; }
[Parameter]
string UserId { get; set; }

我正在尝试检索如下所示网址的查询字符串参数:

http://localhost:50466/confirmemail?Token=SomeReallyLargeToken&UserId=SomeGuidUserId

我怎样才能做到这一点?

【问题讨论】:

  • 这个/confirmemail/{Token}/{UserId}不包含查询参数,它包含路由参数,这是两个完全不同的东西。您应该使用查询参数,因此请从您的 @page 指令中取出 /{Token}/{UserId} 并按照 Antonio Correia 的回答。

标签: .net-core blazor


【解决方案1】:

对于任何对如何传递和获取查询字符串样式中的参数感兴趣的人

http://localhost:50466/confirmemail?Token=SomeReallyLargeToken&UserId=SomeGuidUserId

页面路径不变

@page "/confirmemail/"

你应该得到类似的参数

protected override void OnInitialized()
{
     var uri = navigationManager.ToAbsoluteUri(navigationManager.Uri); //you can use IURIHelper for older versions

     if(QueryHelpers.ParseQuery(uri.Query).TryGetValue("Token", out var token))
     {
         var token_par = token.First();
     }

     if(QueryHelpers.ParseQuery(uri.Query).TryGetValue("UserId", out var userid))
     {
         var userid_par = userid.First();
     }
}

记得添加以下内容

@inject NavigationManager navigationManager
@using Microsoft.AspNetCore.WebUtilities @*for QueryHelpers*@

我正在使用 preview-9

【讨论】:

  • 就我而言,这正是我需要知道的。感谢分享。
  • 你为什么使用 TryGetValue 而不仅仅是 ...["Token"]?
  • 只是添加到上面的答案中,如果您使用的是 wasm,请注意您需要在客户端项目中安装 nuget 包 Microsoft.AspNetCore.WebUtilities(因为它不是默认 blazor 包的一部分。)跨度>
  • 这是一个更好的答案,我不知道为什么这不是被接受的答案。
  • @JensMander TryGetValue 如果查询参数不存在,则避免 KeyNotFoundException:这是 Dictionary<,> 对象的常见行为。
【解决方案2】:

你可以试试吗?

http://localhost:50466/confirmemail/SomeReallyLargeToken/SomeGuidUserId

我认为它应该有效。

更新:如果您想完全从查询参数中获取值,这里是https://learn-blazor.com/pages/router/

【讨论】:

    【解决方案3】:

    这(/{Token}/{UserId})不是查询字符串的模式。它是路由模板 url(路由参数)的一部分。这是一个查询字符串:?Token=SomeReallyLargeToken&UserId=SomeGuidUserId

    我现在不确定,但这可能有效:http://localhost:50466/confirmemail/SomeReallyLargeToken/SomeGuidUserId

    如果你想访问查询参数(不是路由参数),你想像这样使用 IUriHelper:

    var uri = new Uri(UriHelper.GetAbsoluteUri());
    

    请注意,您应该解析返回的值...我曾经看到 Blazor 社区创建的一个实用程序可以做到这一点。

    希望这会有所帮助...

    【讨论】:

      【解决方案4】:

      我建议使用这里介绍的扩展方法:

      https://chrissainty.com/working-with-query-strings-in-blazor/

      我只是放了更多类型:

      public static class NavigationManagerExtensions
      {
          public static bool TryGetQueryString<T>(this NavigationManager navManager, string key, out T value)
          {
              var uri = navManager.ToAbsoluteUri(navManager.Uri);
      
              if (QueryHelpers.ParseQuery(uri.Query).TryGetValue(key, out var valueFromQueryString))
              {
                  if (typeof(T) == typeof(int) && int.TryParse(valueFromQueryString, out var valueAsInt))
                  {
                      value = (T)(object)valueAsInt;
                      return true;
                  }
      
                  if (typeof(T) == typeof(int?) && int.TryParse(valueFromQueryString, out var valueAsNullableInt))
                  {
                      value = (T)(object)valueAsNullableInt;
                      return true;
                  }
      
                  if (typeof(T) == typeof(bool) && bool.TryParse(valueFromQueryString, out var valueAsBool))
                  {
                      value = (T)(object)valueAsBool;
                      return true;
                  }
      
                  if (typeof(T) == typeof(bool?) && bool.TryParse(valueFromQueryString, out var valueAsNullableBool))
                  {
                      value = (T)(object)valueAsNullableBool;
                      return true;
                  }
      
                  if (typeof(T) == typeof(string))
                  {
                      value = (T)(object)valueFromQueryString.ToString();
                      return true;
                  }
      
                  if (typeof(T) == typeof(decimal) && decimal.TryParse(valueFromQueryString, out var valueAsDecimal))
                  {
                      value = (T)(object)valueAsDecimal;
                      return true;
                  }
      
                  if (typeof(T) == typeof(decimal?) && decimal.TryParse(valueFromQueryString, out var valueAsNullableDecimal))
                  {
                      value = (T)(object)valueAsNullableDecimal;
                      return true;
                  }
      
              }
      
              value = default;
              return false;
          }
      }
      

      关于:“处理查询字符串值的更新”部分......我确实喜欢这样:

      <a class="dropdown-item" @onclick='() => GotoLink("thepage?intValue=0&boolValue=true&stringValue=blahBlah")'>goGoGo</a>
      

      GotoLink 方法是这样的:

      private void GotoLink(string url)
      {
          NavManager.NavigateTo(url, forceLoad: true);
      }
      

      顺便说一下组件的路由更干净:

      @page "/ThePage"
      

      【讨论】:

        【解决方案5】:

        一个老问题的新答案:在 2022 年 1 月的时候,查询字符串参数可以使用补充属性 SupplyParameterFromQuery 来处理。

        [Parameter] [SupplyParameterFromQuery]
        public string Token { get; set; }
        [Parameter] [SupplyParameterFromQuery]
        public string UserId { get; set; }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多