【问题标题】:Call a C# non static method from a static method in Blazor invoked by Javascript DotNet.invokeMethodAsync从 Blazor 中由 Javascript DotNet.invokeMethodAsync 调用的静态方法调用 C# 非静态方法
【发布时间】:2021-02-26 12:27:09
【问题描述】:

我知道我们可以通过调用 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");
            }

CS0120:非静态字段需要对象引用, 方法或属性“JSRuntime”

如何使这个静态化:@inject IJSRuntime JSRuntime

【问题讨论】:

    标签: javascript c# .net blazor


    【解决方案1】:

    这实际上是描述in the docs

    夏天: 为更新创建一个静态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);
    }
    

    (未测试)

    注意重要的是要记住,即使组件没有加载(即没有实例),您仍然可以调用 JSInvokable 方法。这可能会推断出未定义的行为!

    编辑:更改为 async Task,由于异步 InvokeVoidAsync 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多