两个不同的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的限制,是否有解决方案?
答案 0 :(得分:0)
好像Blazor中有一个bug。 Steve Sanderson:
听起来像个虫子。感谢您举报。
要求静态方法具有程序集范围内的唯一标识符是有意义的。但是,实例方法需要程序集范围内的唯一标识符是没有意义的。我们只应要求标识符在您传递的实例类型内唯一。
作为解决方法,您可以执行以下操作:
[JSInvokable("SomeUniqueIdentifier")]
public void MyInstanceMethod()
{
...
}
我知道需要这样的解决方法很烦人。我们将修复潜在的错误(最有可能在3.0发布之后)。