代码之家  ›  专栏  ›  技术社区  ›  RA19

从Javascript DotNet.invokeMethodAsync调用的Async中的静态方法调用C#非静态方法

  •  0
  • RA19  · 技术社区  · 5 年前

    我了解到,我们可以通过调用DotNet.invokeMethodAsync方法,从JavaScript中更改DateTime中的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

    1 回复  |  直到 5 年前
        1
  •  9
  •   JHBonarius    5 年前

    这实际上是描述的 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);
    }
    

    (未测试)

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

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