Blazor JS 互操作 - 从 javascript 调用 C# 实例方法

Blazor JS interop - calling C# instance methods from javascript

两个不同的 Blazor 组件定义了以下实例方法:

[JSInvokable]
public void MyInstanceMethod()
{
...
}

在加载时他们调用一个 js 函数,将自己传递给 js:

await JS.InvokeAsync<object>("jsFunction", new DotNetObjectRef(this));

在js中,传递的.NET对象引用保存在一个名为_callback的变量中。 后来javascript发生事件回调实例方法

_callback.invokeMethodAsync("MyInstanceMethod");

浏览器控制台失败并出现以下错误:

blazor.webassembly.js:1 Uncaught (in promise) Error: 
System.InvalidOperationException: 
The assembly 'WebApplication7.Client' contains more than one [JSInvokable] method 
with identifier 'MyInstanceMethod'.
All [JSInvokable] methods within the same assembly must have different identifiers.

顺便说一句,如果只有一个组件具有该方法,则一切顺利。

这是否违反了任何 OO 语言中的基本范围功能之一?

谁能告诉我为什么方法(包括实例方法)需要具有不同的标识符才能成为 JSInvokable?

如果这是 Blazor 的限制,是否有修复它的计划?

Blazor 中似乎存在错误。 Steve Sanderson:


听起来像个错误。感谢您报告。

要求静态方法具有 assembly-wide 唯一标识符是有意义的。然而,实例方法需要 assembly-wide 唯一标识符是没有意义的。我们应该只要求标识符在您传递的实例类型中是唯一的。

作为解决方法,您可以执行以下操作:

[JSInvokable("SomeUniqueIdentifier")]
public void MyInstanceMethod()
{
...
}

我知道需要这样的解决方法很烦人。我们将修复潜在的错误(最有可能在 3.0 发布后)。