blazor - 如何在 .cs 类而不是 Blazor 页面中使用 Blazored.LocalStorage?
问题描述
我看到很多以这种方式工作的例子,但这对我不起作用。有什么帮助吗?
程序.cs
...
using Blazored.LocalStorage;
using TestFullPage.Classes;
namespace TestFullPage
{
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddSingleton<Session>();
await builder.Build().RunAsync();
}
}
}
会话.cs
...
using Microsoft.AspNetCore.Components;
using Blazored.LocalStorage;
namespace TestFullPage.Classes
{
public class Session
{
[Inject]
public ILocalStorageService LocalStorage { get; set; }
public void updateLocalStorage()
{
LocalStorage.SetItemAsync("test", "123");
}
}
}
索引.razor
@page "/"
@inject Session sesssion
<button @onclick="() =>Write()">Write to LocalStorage</button>
@code {
public void Write() {
sesssion.updateLocalStorage();
}
}
未处理的异常呈现组件:对象引用未设置为对象的实例。System.NullReferenceException:对象引用未设置为实例---> LocalStorage.SetItemAsync("test", "123");
解决方案
您正在使用“会话”类作为“组件类”,但并非如此,将其替换为它,它应该可以工作:
public class Session
{
protected readonly ILocalStorageService _localStorage;
public Session(ILocalStorageService LocalStorage)
{
_localStorage = LocalStorage;
}
public void updateLocalStorage()
{
_localStorage.SetItemAsync("test", "123");
}
}
您需要将“会话”从单例更改为铲起,请参阅此线程: 如何在 Blazor 服务器的后端正确使用依赖注入?