Blazor Web App (.NET 8):如何在 WebAssembly 呈现的页面上使用服务器呈现的组件?

Blazor Web App (.NET 8): How to use a server rendered component, on a WebAssembly rendered page?

提问人:Steffan Pallesen 提问时间:11/17/2023 更新时间:11/18/2023 访问量:199

问:

假设我在 Blazor Web 应用 (.NET 8) 中有一个 WebAssembly 呈现的页面:

@page "/counter"
@rendermode InteractiveWebAssembly

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

<ServerSideComponent></ServerSideComponent>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

我有一个带有服务器端渲染的 Razor 组件:

@rendermode InteractiveServer

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

有没有办法在 WebAssembly 呈现的页面上呈现服务器端呈现 blazor 组件?我希望页面在 WebAssembly 中呈现,并且组件在服务器中呈现。

当我尝试这样做时,我得到这个异常:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未经处理的异常呈现组件:无法创建类型为“BlazorApp4.Client.ServerSideComponent”的组件,因为其 渲染模式 “Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode”是 WebAssembly 渲染不支持。System.NotSupportedException: 无法创建以下类型的组件 “BlazorApp4.Client.ServerSideComponent”,因为它的呈现模式 “Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode”是 WebAssembly 渲染不支持。

.net blazor blazor-server-side blazor-webassembly net-8.0

评论

0赞 Mister Magoo 11/17/2023
该代码在客户端上运行 - 因此它无法在服务器呈现任何内容。但是,也许您可以在服务器上调用 api 来呈现组件,然后在 MarkupString 中使用返回的 html 片段?当然,这不会是互动的......

答:

0赞 Ron 11/18/2023 #1

如果使用的是 rendermode InteractiveWebAssembly,则不能使用服务器上定义的组件。最好的方法是让页面具有其默认行为(未指定渲染模式,因此它将使用服务器端渲染),然后从该页面调用两个组件。

然后,您可以定义 compoennts 渲染模式,如下所示:

@page "/counter"


<PageTitle>Counter</PageTitle>

<ClientSideComponent @rendermode=WebAssemblyInteractive />
<ServerSideComponent @rendermode=ServerInteractive />

@code {
   
}

请注意,ServerSideCompoenent 还必须位于客户端项目中,并且无法访问任何服务器资源(如数据库)。如果需要访问服务器资源,则必须在服务器端项目中创建一个控制器,并从客户端组件将其作为 Web API 请求调用。