【问题标题】:Why Blazor app showing an error with any page reload为什么 Blazor 应用程序显示任何页面重新加载错误
【发布时间】:2019-07-31 23:23:25
【问题描述】:

我正在使用 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 一起工作? 以及如何解决该错误?

【问题讨论】:

标签: c# blazor


【解决方案1】:

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

@inject IJSRuntime Js;

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

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

其次,切勿在 Blazor 中使用 async void,该规则的例外是在事件处理程序中运行异步代码。请参阅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");
    }
}

【讨论】:

  • 谢谢 :) 首先,@code 没有智能感知,它只是纯文本。也许我没有提到我正在开发 VS 2019 社区NOT PREVIEW。其次,在某些情况下我必须使用一些等待的函数,所以我需要使用 async。第三,我删除了~,我认为这不是问题,因为文件已经成功添加到页面中,但是页面重新加载时出现问题
  • 您需要使用 VS Preview 进行 Blazor 开发。有些功能目前仅在预览版中可用。使用异步不是问题,而是您的返回类型为 void 而不是 Task。
  • 好的,我想第一步我必须下载VS预览并使用它然后我会看到。
  • 我找到了解决方案。我的错误是在 MainLayout 中注入 IJSRuntime 一次并将其存储在一个静态变量中以便在任何地方使用它。现在,当 IJSRuntime 被注入到每个组件中时,问题就解决了。谢谢你的帮助:)
猜你喜欢
  • 2014-06-10
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多