Сборка не содержит общедоступного вызываемого метода с [JSInvokableAttribute]

Мы используем Blazor WebAssembly, и я хочу вызвать нестатический метод в моем файле Index.razor с помощью JavaScript.

JavaScript:

(function () {

    // keydown event
    window.addEventListener("keydown", function (e) {
        DotNet.invokeMethodAsync('MyBlazorWebAssemblyApp.Client', 'MyMethod');
    });
})();

Index.razor:

@page "/"
@inject HttpClient Http

@code {
    
    // [...]
    
    [JSInvokable]
    public async Task MyMethod()
    {
        var lResponse = await Http.GetFromJsonAsync<object>("Controller/Action");
    }
}

Когда я выполняю код нажатием клавиши, инструменты разработчика в Microsoft Edge показывают мне следующую ошибку:

blazor.webassembly.js:1 System.ArgumentException: сборка MyBlazorWebAssemblyApp.Client не содержит общедоступного вызываемого метода с [JSInvokableAttribute("MyMethod")].

Когда я заменяю атрибут [JSInvokable] от [JSInvokableAttribute("MyMethod")] то появляется та же ошибка.

Как я могу исправить эту проблему?

3 ответа

Решение

Теперь он работает сам. Вот код:

JavaScript:

var GLOBAL = {};
GLOBAL.DotNetReference = null;
GLOBAL.SetDotnetReference = function (pDotNetReference) {
    if (GLOBAL.DotNetReference === null)
    {
        GLOBAL.DotNetReference = pDotNetReference;
    } 
};

(function () {

    // keydown event
    window.addEventListener("keydown", function (e) {
        GLOBAL.DotNetReference.invokeMethodAsync('MyMethod');
    });
})();

Index.razor:

@page "/"
@inject HttpClient Http

@code {
    
    protected override async Task OnInitializedAsync()
    {
        var lDotNetReference = DotNetObjectReference.Create(this);
        JSRuntime.InvokeVoidAsync("GLOBAL.SetDotnetReference", lDotNetReference);
    }
    
    // [...]
    
    [JSInvokable("MyMethod")]
    public async Task MyMethod()
    {
        var lResponse = await Http.GetFromJsonAsync<object>("Controller/Action");
    }
}

Вы должны упомянуть<<Namespace>>.<<TypeName>>.<<MethodName>>

Важно: метод C# должен быть статическим

      window.addEventListener("keydown", async function (e) {
        await DotNet.invokeMethodAsync('MyBlazorWebAssemblyApp.Client', 'MyMethod');
});

#40110 проблема

Если вы ознакомитесь с документацией Microsoft по следующей ссылке:

https://docs.microsoft.com/en-gb/aspnet/core/blazor/call-dotnet-from-javascript?view=aspnetcore-3.1

Это отличается от вашего примера следующим образом:

Кажется, ваш JavaScript пытается вызвать статический метод.NET.

Ваш код C# не является статическим методом.

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