asp.net-core - 从 OnInitializedAsync Blazor 调用 javascript 时出现 JavaScript 互操作错误

标签 asp.net-core blazor-server-side asp.net-blazor

我正在关注 NDC Oslo 的一个示例应用程序,它是这个应用程序:https://github.com/SteveSandersonMS/presentation-2019-06-NDCOslo/tree/master/demos/MissionControl .
这将 JWT 实现为身份验证和授权。但是,当我尝试将代码的实现复制到服务器端 Blazor 时,当我尝试从下面描述的本地存储中获取 JWT token 时出现错误”

JavaScript interop calls cannot be issued at this time. This is because the component is being 
statically rendererd. When prerendering is enabled, JavaScript interop calls can only be performed 
during the OnAfterRenderAsync lifecycle method.

这是我的 blazor 代码
protected override async Task OnInitializedAsync()
{
    var token = await TokenProvider.GetTokenAsync();
    Branches = await Http.GetJsonAsync<List<BranchDto>>(
        "vip/api/lookup/getbranches",
        new AuthenticationHeaderValue("Bearer", token));
}

错误来自
public async Task<string> GetTokenAsync()
{
   //Code Omitted for brevity 
   //This line of code is equivalent to the IJSRuntime.Invoke<string>("localstorage.getitem","authToken") 
   //change to use Blazore.LocalStorage.
    var token = await _localStorageService.GetItemAsync<string>("authToken");
    return token;
 }

我尝试在 上执行代码OnAfterRenderAsync(bool firstRender) 并且错误消失了,但是绑定(bind)到 API 请求的网格没有显示。 API 请求必须填充网格的数据源,该数据源必须是 OnInitializedAsync .有什么解决方法吗?

更新!
我移动了代码 OnAfterRenderAsync 并添加了 StateHasChanged 方法,我得到了所需的行为。
我忘了渲染的连接是一个signalR连接。

最佳答案

根据 “Detect when a Blazor Server app is prerendering” ,您只能安全地运行 OnAfterRenderAsync 中的互操作代码生命周期方法。

但是,由于它在渲染周期之后运行,您需要使用 StateHasChanged() 通知您的组件重新渲染。一旦您的异步过程完成:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        var token = await TokenProvider.GetTokenAsync();
        Branches = await Http.GetJsonAsync<List<BranchDto>>(
            "vip/api/lookup/getbranches",
            new AuthenticationHeaderValue("Bearer", token));

        StateHasChanged();
    }
}

关于asp.net-core - 从 OnInitializedAsync Blazor 调用 javascript 时出现 JavaScript 互操作错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61438796/

相关文章:

c# - 如何阻止从 Controller 继承的类的 OnActionExecuting 中执行操作

authentication - 如何将 Azure OpenIdConnect OWIN 中间件 Cookie 身份验证转换为 JavaScript JWT 以用于 SPA 应用程序?

c# - 使用 navlink 时不会触发 Blazor ASP.Net Core(服务器端)中的自定义 URL 重写规则

asp.net-core - 服务器端 blazor 中的 session 超时重定向

带有 MessagePack 的 SignalR .Net 客户端 - IHubConnectionBuilder 中无法识别 AddMessagePackProtocol 方法

asp.net-core - 将表单数据发布到 Blazor razor 组件(application/x-www-form-urlencoded)

blazor - 如何在 Blazor 中编写自定义值更改事件处理程序?

Blazor 格式化数字的输入类型

asp.net-mvc - Asp.net core MVC (Razor Pages) - 在帖子上绑定(bind)对象的嵌套列表

entity-framework - dotnet core 2 不同环境下运行不同数据库类型