5

我们使用 Blazor WebAssembly,我想通过 JavaScript 在我的 Index.razor-File 中调用一个非静态方法。

JavaScript:

(function () {

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

索引剃刀:

@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")]会出现相同的错误。

我该如何解决这个问题?

4

2 回答 2

6

我自己现在就可以了。这是代码:

JavaScript:

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

(function () {

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

索引剃刀:

@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");
    }
}
于 2020-07-20T09:07:11.303 回答
1

如果您通过以下链接查看 Microsoft 文档:

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

这与您的示例在以下方面有所不同:

您的 JavaScript 似乎正在尝试调用静态 .NET 方法。

您的 C# 代码不是静态方法。

于 2020-07-20T10:04:12.770 回答