gpt4 book ai didi

c# - 为什么 Blazor 应用在​​重新加载任何页面时显示错误

转载 作者:行者123 更新时间:2023-12-05 02:11:35 28 4
gpt4 key购买 nike

我正在使用 Blazor 技术开展项目。有时我需要使用一些 JS 代码,我需要在每个页面中包含不同的 js 文件,据我所知,唯一的方法是使用 JS 函数和 Blazor JS 调用添加它。所以我所做的是:在 _Host.razor 中

function addScriptFile(fileName){
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", file);
document.getElementById(divName).appendChild(script);
}

然后在每个页面(组件)中:

@inject IJSRuntime Js;
@functions{
protected override async void OnAfterRender()
{
await Js.InvokeAsync<object>("addScriptFile","~/js/myFile.js");
}
}

它运行良好,但如果页面已重新加载,则会出现问题。它抛出一个错误System.InvalidOperationException:此时无法发出 JavaScript 互操作调用。这是因为组件正在预呈现,页面尚未加载到浏览器中,或者因为电路当前已断开连接。组件必须将任何 JavaScript 互操作调用包装在条件逻辑中,以确保不会在预呈现期间或客户端断开连接时尝试进行这些互操作调用。

我从这个错误中了解到,我试图在渲染完成之前调用一些 javascript 代码。所以我使用 IComponentContext 来确保服务器已连接。在我解决这个问题的过程中,我创建了一个没有任何 JS 文件的新 Blazor 项目,但它在重新加载页面时抛出了同样的错误

我试着做这个:

@inject IComponentContext ComponentContext
@functions{
protected override void OnAfterRender()
{
if(ComponentContext.IsConnected)
{
//adding scripts
}
}
}

如何让 JS 以合适的方式与 Blazor 一起工作?以及如何修复该错误?

最佳答案

在您的代码示例中,存在几个问题。

@inject IJSRuntime Js;

@functions {
protected override async void OnAfterRender()
{
await Js.InvokeAsync<object>("addScriptFile","~/js/myFile.js");
}
}

首先,您应该使用code 而不是functionsCode 特定于 Blazor 组件,functions 用于 Razor Pages 和 MVC。

其次,永远不要在 Blazor 中使用 async void,规则的异常(exception)是在事件处理程序中运行异步代码。参见 this article了解更多信息。

第三,您在脚本位置的开头有 ~ 字符。这个角色不适用于 Blazor(而且在我看来毫无意义),它只对 MVC 和 Razor Pages 有效。如果您想从应用程序的根目录加载脚本,则只需使用 /,如果您想从相对位置加载脚本,则不要在该位置添加任何前缀。

综上所述,我认为您的代码应该如下所示。

@inject IJSRuntime Js;
@inject IComponentContext ComponentContext

@code {
protected override async Task OnAfterRenderAsync()
{
if (!ComponentContext.IsConnected)
{
return;
}

await Js.InvokeAsync<object>("addScriptFile","/js/myFile.js");
}
}

关于c# - 为什么 Blazor 应用在​​重新加载任何页面时显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57299993/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com