该程序集不包含具有 [JSInvokableAttribute] 的 public 可调用方法
The assembly does not contain a public invokable method with [JSInvokableAttribute]
我们使用 Blazor WebAssembly,我想通过 JavaScript 在我的 Index.razor-File 中调用一个非静态方法。
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: The assembly
'MyBlazorWebAssemblyApp.Client' does not contain a public invokable
method with [JSInvokableAttribute("MyMethod")].
当我用 [JSInvokableAttribute("MyMethod")]
替换属性 [JSInvokable]
时,会出现同样的错误。
我该如何解决这个问题?
现在我自己搞定了。这是代码:
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');
});
})();
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");
}
}
如果您在以下 link 查看 Microsoft 文档:
这与您的示例在以下方面有所不同:
您的 JavaScript 似乎在尝试调用静态 .NET 方法。
您的 C# 代码不是静态方法。
我们使用 Blazor WebAssembly,我想通过 JavaScript 在我的 Index.razor-File 中调用一个非静态方法。
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: The assembly 'MyBlazorWebAssemblyApp.Client' does not contain a public invokable method with [JSInvokableAttribute("MyMethod")].
当我用 [JSInvokableAttribute("MyMethod")]
替换属性 [JSInvokable]
时,会出现同样的错误。
我该如何解决这个问题?
现在我自己搞定了。这是代码:
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');
});
})();
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");
}
}
如果您在以下 link 查看 Microsoft 文档:
这与您的示例在以下方面有所不同:
您的 JavaScript 似乎在尝试调用静态 .NET 方法。
您的 C# 代码不是静态方法。