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

时间:2019-06-02 01:34:42

标签: javascript interop blazor

两个不同的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的限制,是否有解决方案?

1 个答案:

答案 0 :(得分:0)

好像Blazor中有一个bug。 Steve Sanderson


听起来像个虫子。感谢您举报。

要求静态方法具有程序集范围内的唯一标识符是有意义的。但是,实例方法需要程序集范围内的唯一标识符是没有意义的。我们只应要求标识符在您传递的实例类型内唯一。

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

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

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