我创建了一个 .NET8 Blazor 项目(客户端和服务器端),并为客户端添加了 Blazored.LocalStorage nuget 包。在
Program.cs
文件中,我添加服务注册行:
builder.Services.AddBlazoredLocalStorage();
然后,在我想使用它的页面上,我注入实例:
@inject ILocalStorageService _localStorage
不幸的是,当我启动网络应用程序时,我在浏览器中看到错误:
InvalidOperationException:无法为属性提供值 类型“MyProject.Client.Pages.Login”上的“_localStorage”。没有注册的 类型为“Blazored.LocalStorage.ILocalStorageService”的服务。
我做错了什么?
要检查您是否使用全局渲染模式,您可以打开“服务器项目”-Components- App.razor。
全球:
<HeadOutlet @rendermode="InteractiveWebAssembly" />
<Routes @rendermode="InteractiveWebAssembly" />
每页:您需要在每页的任意顶部手动添加
@rendermode InteractiveWebAssembly
。 (不添加时,仅使用服务器端渲染)
<HeadOutlet />
<Routes />
没有类型为“Blazored.LocalStorage.ILocalStorageService”的已注册服务。
您需要将
builder.Services.AddBlazoredLocalStorage();
添加到服务器项目和客户端项目。这是因为 @rendermode InteractiveWebAssembly
仍将在服务器 1 上预渲染。预渲染SSR(服务器端渲染)是在服务器项目中执行的。但由于SSR实际上根本无法访问本地存储。您将需要禁用预渲染。为此:
如果您使用全局渲染模式,请更改 App.razor,例如
<Routes @rendermode="new InteractiveWebAssemblyRenderMode(false)" />
如果您使用每个组件,请在页面顶部添加渲染模式,例如
@rendermode @(new InteractiveWebAssemblyRenderMode(false))