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 发布后)。
两个不同的 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 发布后)。