从 js 使用 blazor interop 调用非静态方法
Calling a non static method using blazor interop from js
正在处理 blazor 应用程序,它有一个方法需要从 JS 调用!当我尝试调用不带 static 关键字的方法时出现此错误 -
The assembly 'AssemblyName' does not contain a public invokable method with [JSInvokableAttribute("INIT_COMPLIANCE")].
只要我添加静态,它就会识别并加载它。
这是我在 blazor 组件中的代码 -
protected override Task OnInitializedAsync()
{
jsToDotNetBridgeReference = DotNetObjectReference.Create(this);
js.InvokeVoidAsync("SetDotNetReference", jsToDotNetBridgeReference);
return base.OnInitializedAsync();
}
[JSInvokableAttribute("INIT_COMPLIANCE")]
public async void InitComplianceComponent(string token)
{
id_token = token;
Console.WriteLine(token);
await GetData();
}
JS-
self.addNewCompliance = function () {
const url = someurl;
var resource = window.authContext.getResourceForEndpoint(url);
window.authContext.acquireToken(resource, function (error, token) {
// Handle ADAL Error
if (error || !token) {
console.log('ADAL Error Occurred: ' + error);
return;
} else {
Blazor.start().then(() => {
window.InitComplianceComponent(window.DotNet, token);
})
//window.InitComplianceComponent(window.DotNet, token);
}
});
}
BlazorInterop.js
InitComplianceComponent = function (dotnetObj, token) {
dotnetObj.invokeMethod("AssemblyName", "INIT_COMPLIANCE", token);
}
我不想使用 static 关键字,因为 GetData
是非静态方法,我无法从静态方法调用它。
我哪里错了。
你可以这样做:
protected override async Task OnInitializedAsync()
{
await JSRuntime.InvokeVoidAsync("yourJsFunctionName",
DotNetObjectReference.Create(this), nameof(MethodToInvokeFromJs));
}
[JSInvokable]
public void MethodToInvokeFromJs()
{
//your code
StateHasChanged();
}
您的 js 代码将如下所示:
function yourJsFunctionName(instance, callback) {
instance.invokeMethodAsync(callback);
}
正在处理 blazor 应用程序,它有一个方法需要从 JS 调用!当我尝试调用不带 static 关键字的方法时出现此错误 -
The assembly 'AssemblyName' does not contain a public invokable method with [JSInvokableAttribute("INIT_COMPLIANCE")].
只要我添加静态,它就会识别并加载它。
这是我在 blazor 组件中的代码 -
protected override Task OnInitializedAsync()
{
jsToDotNetBridgeReference = DotNetObjectReference.Create(this);
js.InvokeVoidAsync("SetDotNetReference", jsToDotNetBridgeReference);
return base.OnInitializedAsync();
}
[JSInvokableAttribute("INIT_COMPLIANCE")]
public async void InitComplianceComponent(string token)
{
id_token = token;
Console.WriteLine(token);
await GetData();
}
JS-
self.addNewCompliance = function () {
const url = someurl;
var resource = window.authContext.getResourceForEndpoint(url);
window.authContext.acquireToken(resource, function (error, token) {
// Handle ADAL Error
if (error || !token) {
console.log('ADAL Error Occurred: ' + error);
return;
} else {
Blazor.start().then(() => {
window.InitComplianceComponent(window.DotNet, token);
})
//window.InitComplianceComponent(window.DotNet, token);
}
});
}
BlazorInterop.js
InitComplianceComponent = function (dotnetObj, token) {
dotnetObj.invokeMethod("AssemblyName", "INIT_COMPLIANCE", token);
}
我不想使用 static 关键字,因为 GetData
是非静态方法,我无法从静态方法调用它。
我哪里错了。
你可以这样做:
protected override async Task OnInitializedAsync()
{
await JSRuntime.InvokeVoidAsync("yourJsFunctionName",
DotNetObjectReference.Create(this), nameof(MethodToInvokeFromJs));
}
[JSInvokable]
public void MethodToInvokeFromJs()
{
//your code
StateHasChanged();
}
您的 js 代码将如下所示:
function yourJsFunctionName(instance, callback) {
instance.invokeMethodAsync(callback);
}