我有一个使用jQuery lib来显示“确认”对话框的应用程序。
当用户在对话框中单击“确定”或“取消”时,首先将对我的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 :(得分:1)
有关更完整的示例,请参见https://docs.microsoft.com/en-us/aspnet/core/blazor/javascript-interop?view=aspnetcore-3.0#instance-method-call,但您可以通过调用将对.net实例的引用传递给javascript代码
DotNetObjectReference.Create(myInstance);
然后javascript代码可以在该对象上调用实例方法。由于组件(以及注入其中的服务)的寿命可能与jquery click处理程序不同,因此可能会引起其他问题,但是上面的链接应该是一个很好的起点。