【问题标题】:Cannot use Vietnamese / signed & space characters in URL parameters in Blazor无法在 Blazor 的 URL 参数中使用越南语/带符号和空格字符
【发布时间】:2019-11-04 03:41:50
【问题描述】:

我使用 blazor 和 .net core 3.0 来开发一个允许在 URL 中传递一些参数的网站。

问题是每当我在 URL 中传递越南语关键字时,blazor 都会引发出现在浏览器控制台上的内部异常。

请注意我无法使用 Encode URL 提取该信息,因为 blazor 在 OnAfterRenderAsync 调用之前会自行引发异常

工作

https://localhost:44316/?keyword=tieng viet
https://localhost:44316/?keyword=tieng%20viet

不工作

https://localhost:44316/?keyword=tiếng việt
https://localhost:44316/?keyword=tiếng%20việt
https://localhost:44316/?keyword=ti%E1%BA%BFng%20vi%E1%BB%87t

如何重现:

  • 只需使用 .net core 3.0 创建一个全新的 blazor 项目。
  • 然后启动项目并尝试使用这些 url。

=>由于我这里没有添加任何额外的代码,所以 blazor 不应该抛出任何异常

这是一个例外:

感谢您的帮助!

【问题讨论】:

  • 这能回答你的问题吗? URL Encode and Decode in ASP.NET Core
  • @mjwills 我不这么认为,因为默认情况下 blazor 应该可以完美处理任何参数。我们可以稍后解码参数值就可以了。问题是 blazor 自己抛出异常
  • 第1步,blazor不应该抛出异常,第2步我们可以解码参数,得到我们需要的东西。
  • 如果你使用我建议的 URL 是否有效?

标签: .net blazor asp.net-core-3.0 blazor-server-side


【解决方案1】:

我每次都要编码和解码

不确定是否是错误。但是,您不必每次都进行编码和解码。作为一种解决方法,我们可以创建一个快速而肮脏的修复程序,以便将查询字符串中的 space 转换为 +

由于调用远程signalRComponentHub::StartCircuit()方法时会发生此错误,我们可以在将位置传递给siganlR之前替换它。根据建议localhost:44316/?keyword=ti%E1%BA%BFng+vi%E1%BB%87t@mjwills's above comment,您可以在_Host.cshtml 中添加script,如下所示:

<script>
    !function(){
        var raw = new URL(window.location.href);
        raw.search = raw.search.replace("%20","+");    // replace the `%20` with "+"
        window.history.replaceState('', document.title, raw);
    }();
</script>
<script src="_framework/blazor.server.js"></script>

通过这种方式,您的服务器端代码不必关心编码。

【讨论】:

  • 你的想法可行,兄弟。如果 URL 包含 %20,我在 OnInitializedAsync 中进行了导航,但是它仅适用于 ServerPrerendered,而不适用于其他人
【解决方案2】:

第一件事:这与 Blazor 无关

您只是在使用无效的 URI。 URI 中使用的每个字符都必须通过 US-ASCII 表具有对应的字符。

Blazor 只是调用 Uri.IsWellFormedUriString,它为您的给定示例返回 false。

正如其他人指出的那样,解决方案是对 url 进行编码。这必须在该 URL 用于导航到 Blazor 页面之前完成。

【讨论】:

  • 我也这么认为,但尝试了 OP 的复制步骤,发现 localhost:44316/?keyword=ti%E1%BA%BFng+vi%E1%BB%87t 有效,localhost:44316/?keyword=ti%E1%BA%BFng%20vi%E1%BB%87t 无效(后者绝对 is 是一个有效的 URL )
  • 我相信你的说法是由Uri.IsWellFormedUriString引起的。让我感到困惑的是,将https://localhost:44316/?keyword=tiếng việt 粘贴到 chrome 时,它​​将被编码为keyword=tiếng%20việt 而不是keyword=tiếng+việt。根据这个thread,似乎%20应该被认为是一个有效的URL?
  • @mjwills 对不起大家。再次阅读您的cmets后。我努力了。它有效!
  • 所以,基本上,正如你提到的,我不明白为什么“空格字符”被转换为“%20”,而不是“+”
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 2018-04-28
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2021-11-18
相关资源
最近更新 更多