Blazor - 从 C# 类调用 JavaScript

Posted

技术标签:

【中文标题】Blazor - 从 C# 类调用 JavaScript【英文标题】:Blazor - Call JavaScript from C# class 【发布时间】:2021-10-10 07:49:35 【问题描述】:

这是我想要实现的目标:

我在 Blazor WASM 项目中有一个(普通)类。我想从我的类中调用一个 javascript 函数。 如果我想从 Razor 组件执行此操作,它工作正常,我将 IJSruntime 和 invokevoidasync 注入我的 JavaScript。

但是当我尝试在课堂上这样做时会出错。 首先我尝试像这样注入它:

[Inject]
IJSRuntime JSRuntime  get; set; 

但最终出现错误消息:值不能为空。 (参数'jsRuntime') 我从this 帖子中了解到我必须“以传统方式注入它”,所以我这样做了:

public class InvokeJavaScript

    private readonly IJSRuntime jSRuntime;

    public InvokeJavaScript(IJSRuntime jSRuntime)
    
        this.jSRuntime = jSRuntime;
    

    public async void InvokeMyJs()
    
        await jSRuntime.InvokeVoidAsync("giveMeAMessage");
    

但从那时起我就被卡住了,我知道这一定是一些关键的 .NET 知识,但我在这里遗漏了一部分。我想调用“InvokeMyJs”方法,例如:

InvokeJavaScript ij = new InvokeJavaScript();
ij.InvokeMyJs();

但是知道我遇到了一个错误:没有给出与“InvokeJavaScript.InvokeJavaScript(IJSRuntime)”所需的形参“jSRuntime”相对应的参数

我得到错误对我来说很有意义,但我不知道如何修复它,我必须向 InvokeJavaScript(IJSRuntime jSRuntime) 发送什么参数以及如何正确执行?谁能举个例子?

【问题讨论】:

您需要提供您的班级InvokeJavaScript 进行注入。类似services.AddScoped<InvokeJavaScript>().... 好的,我将它添加到我的启动课程中,但是如何从那里开始? 这个类然后是可注入的。然后你可以将它注入到任何你想要的组件中。 另外,请注意async void。最好将其设为async Task 并等待它,除非您非常确定您需要开火&忘记模式。 【参考方案1】:

当您使用 DI 时,您必须遵循它。 一般来说,这意味着避免new,如:

InvokeJavaScript ij = new InvokeJavaScript();  // no parameter
在 Startup 中将 InvokeJavaScript 注册为服务。 在需要的地方注入。

程序.cs

builder.Services.AddTransient<InvokeJavaScript>();

SomeComponent.razor

@inject InvokeJavaScript ij 

【讨论】:

好的,这是为了将它注入 Razor,但我怎样才能从“普通”类中进行这项工作?那么从另一个类调用我的 InvokeJavaScript 类中的 Invokemyjs 方法? 再次使用相同的技巧:注入它。因此,也将“正常”类注册为可注入的。正如我所说,DI 一路走来。

以上是关于Blazor - 从 C# 类调用 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

[Inject] 有问题,不能在 C# 类 (Blazor) 中工作

如何从数据库 Blazor C# 中获取 Id 数据

Blazor模式讲解

可以使用 C# 的 Web 前端框架 Blazor

可以使用 C# 的 Web 前端框架 Blazor

可以使用 C# 的 Web 前端框架 Blazor