Blazor: вызов статического метода C# из функции JS, вызываемой из HTML onclick- почему JS не может найти метод?

Внутри компонента Blazor я хочу вызвать метод JS из события HTML onclick тега привязки, таким образом:

<a onclick="window.LoadImage();" class="@CssClass">@DisplayName</a> 

Мой метод JS:

window.LoadImage = () => {
    DotNet.invokeMethodAsync('MyProject', 'FireEvent').then();
}

Внутри метода JS я хочу запустить статический метод C# для запуска события, таким образом:

[JSInvokable]
public static void FireEvent()
{
   StateEngine.LoadImage(DisplayName, Target);
}
[Parameter]
public string DisplayName { get; set; }
[Parameter]
public string Target { get; set; }

Я не могу заставить метод JS найти метод C#. Я пробовал несколько конфигураций имени для первого параметра, например

MyProject (the assembly name)
MyProject.FolderName.ComponentName
FolderName.ComponentName
ComponentName

назвать несколько. Я также пробовал перетасовать имена через второй параметр.

Как это должно работать? Что мне не хватает?

PS Не обращайте внимания на свойства экземпляра в статическом методе. У меня есть обходной путь, но я не хочу загромождать пост.

2 ответа

Решение

Судя по всему, вам будет лучше использовать ссылку JSInterop, чтобы вы могли получить доступ к свойствам компонентов.

Бритва

@inject IJSRuntime JS
@implements IDisposable

 <a @onclick=Clicked>Click here</a>

@code
{
  private DotNetObjecctReference ObjRef;

  [JSInvokable]
  public void FireEvent()
  {
     StateEngine.LoadImage(DisplayName, Target);
  }

  private Task Clicked()
  {
    return JS.InvokeVoidAsync("window.LoadImage", ObjRef);
  }

  protected override Task OnInitializedAsync()
  {
    ObjRef = DotNetObjectReference.Create(this);
  }

  void IDisposable.Dispose()
  {
    ObjRef.Dispose();
  }
}

JS

window.LoadImage = (dotNetObject) => {
    dotNetObject.invokeMethod('FireEvent');
}

Ваш код выглядит хорошо. Возможно, он не может найти ваш метод.Net. Повторите попытку..

JS

window.LoadImage = function () {
DotNet.invokeMethodAsync("MyBlazorProject.UI", "FireEvent").then();}

Первый параметр должен быть AssemblyName вашего компонента Blazor. В моем случае это "MyBlazorProject.UI".
Второй параметр должен быть именем метода.

HTML

<a onclick="window.LoadImage()" class="btn btn-primary">Call .Net Method FireEvent</a>

здесь onclick - это событие JavaScript, что хорошо и в вашем случае.

Код C#

[JSInvokable]
public static void FireEvent()
{
    //debugger hits here
    //StateEngine.LoadImage(DisplayName, Target);
}

У меня все работает нормально. Отладчик попадает в метод FireEvent .Net после щелчка по тегу привязки.

Благодарность

Другие вопросы по тегам