Blazor JS interop - вызывает методы экземпляра C # из javascript - PullRequest
0 голосов
/ 02 июня 2019

Два РАЗЛИЧНЫХ компонента 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.

Кстати, все идет хорошо, если только один компонент имеетmethod.

Разве это не нарушение одной из фундаментальных возможностей области видимости в любом языке OO?

Кто-нибудь может мне сказать, почему методы, включая методы экземпляров, должны иметь разные идентификаторы длябыть JSInvokable?

Если это предел Blazor, есть ли план это исправить?

1 Ответ

0 голосов
/ 13 июня 2019

Похоже, в Blazor есть ошибка. Стив Сандерсон :


Звучит как ошибка.Спасибо за сообщение.

Имеет смысл требовать, чтобы статические методы имели уникальные идентификаторы для всей сборки.Однако не имеет смысла, что методы экземпляра нуждаются в уникальных идентификаторах всей сборки.Мы должны требовать, чтобы идентификатор был уникальным только для типа экземпляра, который вы передаете.

В качестве обходного пути вы можете сделать что-то вроде:

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

Я знаю, что это раздражаетнужен обходной путь, как это.Мы исправим основную ошибку (скорее всего, после 3.0 кораблей).

...