用途:在 Blazor 应用中实现 JavaScript 与 .NET 双向互操作,即从 .NET 调用 JS 函数,以及从 JS 调用 .NET 方法。
主要能力与用法: 从 .NET 调用 JS:通过 @inject IJSRuntime JS 注入,使用 await JS.InvokeVoidAsync("alert", ...) 调用无返回值的 JS,使用 await JS.InvokeAsync<string>("localStorage.getItem", "key") 获取返回值;可传入 ElementReference 引用 DOM 元素,且需在 OnAfterRenderAsync 中调用(此时 DOM 已存在)。 从 JS 调用 .NET:静态方法使用 [JSInvokable],由 JS 以 DotNet.invokeMethodAsync('MyApp', 'GetDataFromDotNet') 调用;实例方法通过 DotNetObjectReference.Create(this) 创建引用,再由 JS 用 dotNetRef.invokeMethodAsync('HandleJsCallback', 'data') 调用,并需释放引用。 同置 JavaScript:.NET 10 推荐将 JS 作为同置的 .razor.js 模块(如 Map.razor.js),通过 JS.InvokeAsync<IJSObjectReference>("import", "./Components/Pages/Map.razor.js") 导入 ES 模块后调用其导出函数,并在 DisposeAsync 中调用 dispose 并释放模块。
适用场景:需要在 Blazor 中使用第三方 JS 库(如地图)、访问浏览器 API(如 localStorage)、或将 DOM 事件回传给 .NET 的场合。
限制与注意事项:JS 互操作只能在 OnAfterRenderAsync 中进行;服务端模式使用 IJSRuntime,WASM 才可用 IJSInProcessRuntime;应始终释放 IJSObjectReference 与 DotNetObjectReference,减少互操作调用次数(可批量处理),并在 Blazor Server 中处理 JSDisconnectedException 以优雅清理。