从JavaScript调用Blazor方法

时间:2018-08-06 15:27:21

标签: javascript visual-studio blazor

我正在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命令行实用程序来创建我的起点,但是在所有项目中都得到相同的消息。在我看来,我似乎在这里缺少一些基本知识。

6 个答案:

答案 0 :(得分:3)

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

但是,一旦您的Blazor代码运行后,您可以做的是,从C#代码中调用JavaScript代码。完成此操作后,您的JavaScript代码可以依次调用Blazor代码。

希望这可以解决问题...

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我正在使用服务器端刀片

我遇到了js错误 未设置.NET呼叫调度程序

是的..看起来Blazor尚未初始化。.

不喜欢超时 ..似乎很hacky,并且UI太长了

不愿意从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()将重新使用现有连接(如果存在)

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

答案 4 :(得分:0)

<块引用>

使用 Microsoft.JSInterop;

[Inject] protected 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);
}

答案 5 :(得分:0)

在错误的时间使用 JavaScript 互操作时,可能会收到 No .NET call dispatcher has been set 错误。看看this StackOverflow question