InteractiveWebAssembly 页面似乎需要在服务器端和客户端都声明服务

YMC*_*YMC 2 asp.net-core blazor blazor-server-side blazor-webassembly

我正在从 Blazor WebAssembly 项目迁移到 .net 8“Blazor Web App”项目,该项目支持客户端和服务器渲染内容。

我对 IoC 的工作方式有点困惑。这是文档没有提到的事情,但在全新的“Blazor Web App”项目上清楚地再现了这一点:对于定义为的页面@rendermode InteractiveWebAssembly(例如Counter.razor带有注入的服务,如@inject ITestIoc testIoc),我必须ITestIoc在两个位置定义服务:Program.cs客户端项目和Program.cs服务器项目,即使它只在 wasm 内部使用。ITestIoc如果我错过了一处,它会抛出服务未定义的异常。

可能发生的情况是,它InteractiveWebAssembly首先在服务器端渲染页面,然后通过 wasm 进行所有进一步的交互。因此,“Blazor Web App”中的 WebAssembly 似乎与常规 WebAssembly 项目中的处理方式有所不同。我知道还有另一种类型的 WebAssembly 类型的项目,仅支持 wasm,但我也希望可以使用服务器端。所以我想知道是否有任何办法可以解决这个问题,如果我想要某些页面仅进行 wasm 渲染,而根本不需要服务器渲染?

Qia*_* Fu 5

因为@rendermode InteractiveWebAssembly页面仍然在服务器中预渲染。所以你需要在服务器项目中注册服务。
要禁用预渲染,您可以使用
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender:false))
@rendermode @(new InteractiveWebAssemblyRenderMode(false))
如果您在 App.razor 中有全局 RenderMode,也可以将它们设置为

<HeadOutlet @rendermode=@(new InteractiveWebAssemblyRenderMode(false)) />
<Routes @rendermode=@(new InteractiveWebAssemblyRenderMode(false)) />
Run Code Online (Sandbox Code Playgroud)