Вопрос:

Blazor JS interop - вызывает методы экземпляра C # из javascript

javascript interop blazor

45 просмотра

1 ответ

411 Репутация автора

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

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

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

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

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

Автор: Franco Tiveron Источник Размещён: 02.06.2019 01:34

Ответы (1)


0 плюса

411 Репутация автора

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


Похоже, ошибка. Спасибо, что сообщили об этом.

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

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

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

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

Автор: Franco Tiveron Размещён: 12.06.2019 09:54
Вопросы из категории :
32x32