【问题标题】:Calling a non static method using blazor interop from js使用来自 js 的 blazor 互操作调用非静态方法
【发布时间】:2021-11-15 04:23:05
【问题描述】:

在 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 是非静态方法,我不能从静态方法中调用它。

我哪里错了。

【问题讨论】:

  • 嗨,是的,我通读了它,但我很难理解非静态方法的调用。你能帮我解决我所缺少的吗!谢谢

标签: javascript .net blazor blazor-webassembly blazor-jsinterop


【解决方案1】:

你可以这样做:

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);
}

【讨论】:

  • 是的,这行得通!非常感谢您的帮助:)
  • 如果我们想从 JS 向 Blazor 函数发送参数会是什么样子?并想从 Blazor 函数返回一个值给 JS 函数?
  • 你可以在你的 js 函数 instance.invokeMethodAsync(callback, "argument from js").then(returnedValueFromCS => console.log(returnedValueFromCS)); 上做这样的事情。如果您想获得详细答案,请提出单独的问题。
猜你喜欢
  • 2020-07-15
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多