不能在 Blazor 的 URL 参数中使用越南语/签名 & space 字符

Cannot use Vietnamese / signed & space characters in URL parameters in Blazor

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

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

请注意 我不能使用 Encode URL 提取该信息,因为 blazor 在 OnAfterRenderAsync 调用 [= 之前​​自行抛出异常17=]

工作

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

重现方式:

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

这里是例外:

感谢您的帮助!

首先要做的是:这不是 Blazor 特有的

您只是使用了一个无效的 URI。 URI 中使用的每个字符都必须通过 US-ASCII table.

具有对应的字符

Blazor 只是调用 Uri.IsWellFormedUriString,对于您给定的示例,returns 为 false。

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

I have to encode and decode every time

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

由于在调用建议 localhost:44316/?keyword=ti%E1%BA%BFng+vi%E1%BB%87t 的远程信号 R ComponentHub::StartCircuit() method, we can replace the location before it is passed to siganlR. Based on @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>

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