我想创建一个可以在网站上的不同页面之间访问的数据存储。我希望在每个页面上运行相同的代码。我认为最好将它放入其中,而不是放在每个页面上,MainLayout.razor
这样我就可以在那里编辑它。
但是每个页面都有一个范围数据的新实例,并且它不被共享。
如果我获取代码并手动将其插入到每个页面上,那么它就可以正常工作。
我的问题是:
- 为什么这在 中不起作用
MainLayout
?是范围不同吗?此页面还有其他问题吗? - 无需手动添加,让相同的代码在每个页面上运行的最佳方法是什么?
这是一个服务器项目(不是 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>
编辑:
为了尝试解决这个问题,我创建了一个组件,并手动将其插入到每个页面上 - 然后我可以在一个地方编辑代码:
@inject ScopedDataStore ScopedData
@inject NavigationManager _nav
<h3>Last URL = @(ScopedData.GetLastUrl()) </h3>
@code {
protected override Task OnInitializedAsync()
{
ScopedData.SetNavigationManager(_nav);
Console.WriteLine("GlobalComp OnInitializedAsync");
ScopedData.PushCurrentUrl(_nav.Uri);
return Task.CompletedTask;
}
}