11

我正在 Visual Studio 中试验 Blazor,特别是从 JavaScript 调用 Blazor 代码。我有理由相信我已经拥有了所有正确的库。但是,当我尝试使用 invokeMethodAsync 调用我的 Blazor 方法时,我收到消息“未设置 .net 调用调度程序”。在我的 Index.Html 文件中,我有这个:

<script> DotNet.invokeMethodAsync("BlazorFour.App", "HelloYou").then(data => alert(data), reason => alert(reason)); </script>

(这是生成错误消息的警报(原因))

我在 Blazor 项目中添加了一个类文件,其中包含以下内容:

using Microsoft.JSInterop;
using System.Threading.Tasks;
public class HelloWorld
{
[JSInvokable]
public static Task<string> HelloYou()
{
    return Task.FromResult("Hello, ");
}
}

我使用了 Visual Studio 中的所有模板和 dotnet -new blazor 命令行实用程序来创建我的起点,但在所有项目中都获得了相同的消息。在我看来,我可能在这里遗漏了一些基本的东西。

4

6 回答 6

4

Peter Vogel:如果您可以从 JavaScript 代码调用 Blazor C# 方法,那就太好了。现在,这不太可能:仅从 JavaScript 调用 Blazor C# 是行不通的(您将收到有关呼叫调度程序不可用的消息)。

但是,您可以做的是,在 Blazor 代码运行后,从 C# 代码调用 JavaScript 代码。完成此操作后,您的 JavaScript 代码可以反过来调用 Blazor 代码。

希望这能解决问题...

于 2018-08-28T18:59:33.137 回答
2

我正在使用服务器端 blazor

我收到 js 错误 没有设置 .NET 调用调度程序

所以是的.. 看起来 Blazor 没有初始化..

不热衷于超时 .. 看起来很老套,用户界面也很迟钝

不热衷于从 C# 代码调用 JavaScript 代码。完成此操作后,您的 JavaScript 代码可以反过来调用 Blazor 代码。' .. 再次看起来很老套

这对我有用..

async function myBlazoryFunctionThing() {
    // see https://sourcegraph.com/github.com/aspnet/AspNetCore@bd65275148abc9b07a3b59797a88d485341152bf/-/blob/src/Components/Web.JS/src/Boot.Server.ts#L41:9
   await window.Blazor.reconnect();
   
   ..now it's safe to do my stuff
}

“似乎” Blazor.reconnect()将重新使用现有连接(如果有的话)

...所以它实际上并不是“重新连接”(所以“似乎”没有太多开销;-))

于 2019-10-17T08:44:02.687 回答
1

我尝试了一个 setTimeout(5000 毫秒延迟),它对我有用。(当然,不需要每次都使用 setTimeout,只是第一次)。

例如 setTimeout(DotNet.invokeMethod(...), 5000);

于 2018-12-31T12:58:13.063 回答
0

我想这是一个时间问题,并非所有内容都已加载/初始化。

您是否尝试过将 js 代码放在按钮 onclick 事件中?

于 2018-08-06T15:45:16.987 回答
0

使用 Microsoft.JSInterop;

[注入] 受保护的 IJSRuntime JSRuntime { get; 放; }

从您的 blazor 函数调用此方法中的此函数

await JSRuntime.InvokeAsync<object>("fnToJavascriptCall", DotNetObjectReference.Create(this));

在 blazor 文件中创建此函数

[JSInvokable]
        public async Task fnToCallFromJavascript(int param1, int param2)
        {
            //Do some stuff
            StateHasChanged();
        }

在您的 javascript 文件中

var fnToJavascriptCall = function (param1,currentInstance)
{
    //Do your stuff
    currentInstance.invokeMethodAsync("fnToCallFromJavascript", param1, param2);
}
于 2021-02-17T09:43:09.883 回答
0

No .NET call dispatcher has been setJavaScript 互操作在错误的时间使用时,可能会收到错误。看看这个 StackOverflow 问题

于 2021-07-08T15:48:20.820 回答