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 после щелчка по тегу привязки.
Благодарность