我想创建一个可在网站不同页面之间访问的数据存储。我希望在每个页面上运行相同的代码。我认为最好不要将其放在每一页上,而是将其放入
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>
它没有被共享的原因是因为你已经这样配置了。
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.