如何在 Blazor .Net 8 中将对象从布局传递到页面

问题描述 投票:0回答:1

我有一个带有每页渲染的 Blazor .Net 8 WebApp 应用程序。我的布局页面位于服务器应用程序中,只是一个没有交互性的普通 SSR。 我有一个范围服务,我在布局中的 OnInitializedAsync 方法中设置属性。我的页面位于客户端应用程序中,并且具有 InteractiveAuto 且 prerendering = false。在客户端页面中,范围服务没有设置任何属性。

在 .Net 6 或 7 服务器应用程序中,可以从页面检索值并完美运行。显然,作用域服务不具有跨渲染模式的值。我无法使用 Singleton,因为这些值是特定于用户的。

我尝试过 CascadingValues,但这些也不能跨渲染模式。我还尝试了静态属性,但也不起作用。我无法使用 localstorage,因为无法在 OnInitializedAsync 中使用 localstorage。我不想使用 OnAfterRenderAsync,因为每个页面都需要这些值,而且我永远无法在页面上使用 OnInitializedAsync。

有人知道传递数据的方法吗?我无法想象我是唯一需要这个的人。

c# .net blazor
1个回答
0
投票

在 Blazor .NET 8 中,可以通过各种技术实现将数据从布局传递到页面。一种常见的方法是使用级联参数,但既然您提到级联值不能跨渲染模式,我们将探索使用范围服务的替代方法。

首先,确保您的范围服务已在 Blazor 应用程序中正确注册。在 Startup.cs 文件的 ConfigureServices 方法中,注册您的作用域服务,如下所示:

services.AddScoped<MyScopedService>();

接下来,在布局页面 (MainLayout.razor) 中,注入范围服务并在 OnInitializedAsync 方法中设置其属性:

    @inherits LayoutComponentBase

    @inject MyScopedService myScopedService

    @code {
         protected override async Task OnInitializedAsync()
           {
             myScopedService.MyProperty = "Value from layout";
             await base.OnInitializedAsync();
            }
           }

现在,在 Blazor 页面 (MyPage.razor) 中,注入作用域服务并访问其属性:

@page "/my-page"
@inject MyScopedService myScopedService

<h1>Hello, Blazor!</h1>

<p>Value from layout: @myScopedService.MyProperty</p>

确保您的页面以交互方式渲染 (InteractiveAuto),并且在 _Host.cshtml 文件中将预渲染设置为 false:

<component type="typeof(App)" render-mode="ServerPrerendered" prerender-mode="None" />

通过遵循这种方法,您的作用域服务应该在渲染模式下保持其状态,从而允许您成功地将数据从布局传递到页面。如果您遇到任何问题或有具体要求,请随时提供更多详细信息以获得进一步帮助。

© www.soinside.com 2019 - 2024. All rights reserved.