不能在 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
重现方式:
- 只需使用 .net core 3.0 创建一个全新的 blazor 项目。
- 然后启动项目并尝试使用这些 url。
=> 因为我没有在这里添加任何额外的代码,所以 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>
通过这种方式,您的服务器端代码不必关心编码。
我使用 .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
重现方式:
- 只需使用 .net core 3.0 创建一个全新的 blazor 项目。
- 然后启动项目并尝试使用这些 url。
=> 因为我没有在这里添加任何额外的代码,所以 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>
通过这种方式,您的服务器端代码不必关心编码。