从JavaScript DotNet调用的Blazor静态方法调用C#非静态方法,invokeMethodAsync

aij0ehis  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(158)

我知道我们可以通过调用方法DotNet. invokeMethodAsync从JavaScript中更改Blazor中的C#属性值。我有以下工作,但在此方法中,我还想调用一个非静态方法。
JS文件:

[script.js]

function ChangeContentJS() {
    DotNet.invokeMethodAsync('InvokeFromJsApp', "ChangeParaContentValue", "New Content");
}

剃刀页:

[Index.razor]
    
    @page "/"
    
    @inject IJSRuntime JSRuntime
    
    <h1>Change C# property value from JavaScript</h1>
    <br />
    <button @onclick='ButtonClickHandler'>Change Content - JS</button>
    <br />
    <p>@ParaContent</p>
    
    @code {
        public static string ParaContent = "Some Text Content"; 

        public async Task ButtonClickHandler()
        {
            await JSRuntime.InvokeAsync<string>("ChangeContentJS");
        }
    
        [JSInvokable]
        public static void ChangeParaContentValue(string value)
        {
            ParaContent = value;
            RunNewCode(); //DOESNT WORK AS ITS A NON-STATIC METHOD
        }

        public void RunNewCode()
        {
           jsRuntime.InvokeVoidAsync("RunFunction");
        }
    }

我试图在一个静态方法中运行一个非静态方法(在BLAZOR应用程序中)。我如何调用这个方法?
我尝试将以下方法设置为静态,并得到以下错误:

public static void RunNewCode()
            {
               jsRuntime.InvokeVoidAsync("RunFunction");
            }

CS 0120:非静态字段、方法或属性“JSRRuntime”需要对象引用
如何使其成为静态:@注入IJSRuttime JSRuttime

c3frrgcw

c3frrgcw1#

这在文献中有描述
summery:为更新创建一个静态Action,并注册本地示例

private static Func<string, Task> ChangeParaContentActionAsync;

private async Task LocalChangeParaContentValueAsync(string value)
{
    ParaContent = value;
    await jsRuntime.InvokeVoidAsync("RunFunction");
}

protected override void OnInitialized()
{
    base.OnInitialized();
    ChangeParaContentActionAsync = LocalChangeParaContentValueAsync;
}

[JSInvokable]
public static async Task ChangeParaContentValue(string value)
{
    await ChangeParaContentActionAsync?.Invoke(value);
}

(not测试)
注意:即使组件没有加载(即没有示例),您仍然可以调用JSInvokable方法,这一点非常重要。这可能会导致未定义的行为!
编辑:由于异步InvokeVoidAsync方法,更改为async Task

ffdz8vbo

ffdz8vbo2#

你可以试试这个方法。它似乎对我有用,但我不知道这是不是一件好事。

private static CurrentRazorComponentClassName _app;

public CurrentRazorComponentClassName ()
{
    _app = this;
}

[JSInvokable]
public static void MudaTextoNoBlazor(string texto)
{
    textojs = texto;
    contentEditable = false;
    _app.StateHasChanged();
}

相关问题