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

使用从JS代码到静态Blazor方法的注入服务

  •  0
  • Vivendi  · 技术社区  · 6 年前

    我有一个应用程序,它使用jQuery库来显示“确认”对话框。

    当用户在对话框上单击“确定”或“取消”时,首先会回调我的Javascript代码。在那里,我根据用户的决定调用Blazor方法。

    这一切看起来像这样:

    我的js代码:

    $('.alert-yesno).on('click', function() {
        // For simplicity I immediately call the Blazor method
        DotNet.invokeMethodAsync('[Assembly name]', 'DoSomething')
                                .then(data => {
                                    // do something...
                                });
    });
    

    Blazor页面:

    @inject MyService MyService
    
    <button class="alert-yesno">Show dialog</button>
    
    @code
    {
        [JSInvokable]
        public static async Task DoSomething()
        {
            // How to use the non static MyService here...?
        }
    }
    

    这一切都很好。Javascript部分调用我的Blazor方法。但我该怎么用呢 MyService 从那里开始?这被注入到页面中。这很好,因为它使用依赖注入。

    我不想创造一个 new 每次都从 static 方法,因为这样我就失去了所有自动注入的依赖项。

    我该如何解决这个问题?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Eric Damtoft    6 年前

    看见 https://docs.microsoft.com/en-us/aspnet/core/blazor/javascript-interop?view=aspnetcore-3.0#instance-method-call 有关更完整的示例,但可以将引用传递给。net实例通过调用

    DotNetObjectReference.Create(myInstance);
    

    然后javascript代码可以调用该对象上的实例方法。由于组件(以及注入其中的服务)的寿命可能与jquery click处理程序不同,这可能会导致其他一些问题,但上面的链接应该是一个很好的起点。