Blazor Wasm Microsoft.JSInterop.JSException:找不到“blazorCulture.get”

问题描述 投票:0回答:2

我已按照 文档 进行操作,并按照文章中的说明 100% 实现了我的 Blazor Wasm 本地化。微软建议在应用程序启动时调用js,如下所示。

builder.Services.AddLocalization();

var host = builder.Build();

CultureInfo culture;
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");

if (result != null)
{
    culture = new CultureInfo(result);
}
else
{
    culture = new CultureInfo("en-US");
    await js.InvokeVoidAsync("blazorCulture.set", "en-US");
}

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

await host.RunAsync();

这工作正常,但有时当我打开起始页时,它会返回一个 Js 错误告诉我

blazor.webassembly.js:1 Microsoft.JSInterop.JSException: Could not find 'blazorCulture.get' ('getBlazorCulture' was undefined).
blazor.webassembly.js:1 Error: Could not find 'blazorCulture.get' ('blazorCulture.get' was undefined).

当我按 contol+f5 强制重新加载缓存数据时,错误消失。什么可能导致此问题以及如何解决它?

编辑: 下面是我的 Index.html Body 的样子,在这里我怀疑由于cultureget.jscultureset.js是最后一个,其他js文件加载时间比Blazor启动时间更长,尽管这种情况并不总是发生。因此,由于 blazor 已经启动,并且最后一个 js 文件是在 blazor 启动后加载的,因此会发生此错误。问题是有没有办法确保在 Blazor 启动之前加载所有 js 文件?当然,更快的修复可以在这里将这些 js 移到 blazor.web assembly.js 之后。

<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<!-- third party -->
<script src="https://unpkg.com/js-logger/src/logger.min.js"></script>

<!-- custom code -->
<script type="module" src="_content/logger.js"></script>
<script type="module" src="_content/eventHandlerUtils.js"></script> 
<script src="_content/cultureget.js"></script>
<script src="_content/cultureset.js"></script>
blazor blazor-webassembly
2个回答
0
投票

我制作了以下代码补丁,因为我遇到了同样的问题。然而,应该找到更好的解决方案。但是,如果我们向用户提供错误消息,他们将能够理解出了什么问题。

将用于获取文化的 try-catch 添加到 program.cs 中。使用以下代码更新您的 MainLayout.razor

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
         var getCulture = await JS.InvokeAsync<string>("blazorCulture.get");
         if (!string.IsNullOrWhiteSpace(getCulture) && !CultureInfo.DefaultThreadCurrentCulture!.Name.Equals(getCulture))
         {
              // Show error popup or toastr
         }
    }
}

0
投票

我很长一段时间都遇到同样的问题,现在我通过为 blazor 文化内容制作一个单独的 js 文件来修复它,就像您对“cultureget.js 和cultureset.js”所做的那样,并将其放在上面 “_framework/blazor.web assembly.js”,因为这个主脚本抛出文化内容未定义的错误。

现在,culture js 的东西会首先加载,我不会再遇到那个烦人的错误了。

希望我能帮忙:D

© www.soinside.com 2019 - 2024. All rights reserved.