为什么在 MainLayout.razor 中重新实例化作用域服务?每一页都有

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

我想创建一个可在网站不同页面之间访问的数据存储。我希望在每个页面上运行相同的代码。我认为最好不要将其放在每一页上,而是将其放入

MainLayout.razor
中,这样我就可以在一个位置对其进行编辑。

但是每个页面都有一个范围数据的新实例,并且它不被共享。

如果我获取代码并手动将其插入到每个页面上,那么它就可以正常工作。

我的问题是:

  1. 为什么这在
    MainLayout
    中不起作用?是范围不同吗?此页面还有其他问题吗?
  2. 在每个页面上运行相同代码而无需手动添加的最佳方法是什么?

这是一个服务器项目(不是 WASM)

我尝试过:


in Program.cs :

builder.Services.AddScoped<ScopedDataStore>();


in MainLayout.razor:

@inject ScopedDataStore ScopedData
@inject NavigationManager _nav

...

protected override async Task OnInitializedAsync()
{
    ScopedData.SetCurrentUrl(_nav.Uri);
}


and ScopedDataStore:

public class ScopedDataStore
{

    private string CurrentUrl="";
    private string PreviousUrl="";

    public void SetCurrentUrl(string x)
    {
        PreviousUrl = CurrentUrl;
        CurrentUrl = x;
    }

    public string GetLastUrl()
    {
        return this.GetHashCode().ToString();
    }



}

这是在 MainLayout.razor 中:

<article class="content px-4">
     

     @Body

     <h1>Last URL : @ScopedData.GetLastUrl()</h1

 </article>

scope blazor global
1个回答
0
投票

它没有被共享的原因是因为你已经这样配置了。

Layout
在服务器上的
HttpRequest
上下文中静态呈现,页面呈现两次,一次在服务器上静态呈现,第二次在 Blazor Hub SPA 上下文中呈现。

要共享范围内的 DI 上下文,您需要将交互性配置为全局。

App.razor 更改为:

    <HeadOutlet @rendermode="InteractiveServer" />
</head>

<body>
    <Routes @rendermode="InteractiveServer" />

阅读并理解 - https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-8.0.

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