Blazor具有如下javascript隔离:
var module = await js.InvokeAsync<IJSObjectReference>("import",./_content/MyComponents/exampleJsInterop.js");
await module.InvokeAsync<string>("showPrompt", message);
有可能将其与取消编组的呼叫结合起来吗?我想做这样的事情:
var module = await js.InvokeUnmarshalled<IJSUnmarshalledObjectReference>("import",./_content/MyComponents/exampleJsInterop.js");
await module.InvokeUnmarshalled<string>("showPrompt", message);
到目前为止,还没有一个引用未分组JS模块的解决方案,但是您可以执行类似的操作来检查IJSUnmarshalledRuntime
是否可用:
// Check if the IJSRuntime is the WebAssembly implementation of the JSRuntime
if (JsRuntime is IJSUnmarshalledRuntime wasmJsRuntime)
{
wasmJsRuntime.InvokeUnmarshalled<string, string, byte[], bool>("Download", fileName, contentType, file);
}
else
{
// Fall back to the slow method if not in WebAssembly
await DownloadModule.InvokeVoidAsync("Download", fileName, contentType, file);
}
有关使用IJSUnmarshalledRuntime
的更多信息,请点击此处:https://learn.microsoft.com/en-us/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-5.0#解组js互操作
现在可以在.Net 6中实现。这里讨论了更改Github讨论
您现在可以使用铸造作为您的模块参考:
var module = await js.InvokeAsync<IJSObjectReference>("import",./_content/MyComponents/exampleJsInterop.js");
if(module is IJSUnmarshalledObjectReference objRef)
{
objRef.InvokeUnmarshalled<string, string, byte[], bool>("Download", fileName, contentType, file);
}
使用.Net 5可以使用反射来调用一些内部函数。模块只有一个附加参数:long targetInstanceId。在我的项目中,这些id从1开始,每个导入的模块都会增加1。源