如何在 .cs class 而不是 Blazor 页面中使用 Blazored.LocalStorage?
How to consume Blazored.LocalStorage inside a .cs class instead a Blazor page?
我看到很多以这种方式工作的例子,但这对我不起作用。有帮助吗?
Program.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();
}
}
}
Session.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");
}
}
}
Index.razor
@page "/"
@inject Session sesssion
<button @onclick="() =>Write()">Write to LocalStorage</button>
@code {
public void Write() {
sesssion.updateLocalStorage();
}
}
未处理的异常呈现组件:未将对象引用设置为对象的实例。
System.NullReferenceException: 对象引用未设置到实例 ---> LocalStorage.SetItemAsync("test", "123");
您正在使用 class 'Session' 作为 'component class' 但事实并非如此
用这个替换它,它应该可以工作:
public class Session
{
protected readonly ILocalStorageService _localStorage;
public Session(ILocalStorageService LocalStorage)
{
_localStorage = LocalStorage;
}
public void updateLocalStorage()
{
_localStorage.SetItemAsync("test", "123");
}
}
您需要将 'Session' 从单例更改为 scooped,请参考此线程:
我看到很多以这种方式工作的例子,但这对我不起作用。有帮助吗?
Program.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();
}
}
}
Session.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");
}
}
}
Index.razor
@page "/"
@inject Session sesssion
<button @onclick="() =>Write()">Write to LocalStorage</button>
@code {
public void Write() {
sesssion.updateLocalStorage();
}
}
未处理的异常呈现组件:未将对象引用设置为对象的实例。 System.NullReferenceException: 对象引用未设置到实例 ---> LocalStorage.SetItemAsync("test", "123");
您正在使用 class 'Session' 作为 'component class' 但事实并非如此 用这个替换它,它应该可以工作:
public class Session
{
protected readonly ILocalStorageService _localStorage;
public Session(ILocalStorageService LocalStorage)
{
_localStorage = LocalStorage;
}
public void updateLocalStorage()
{
_localStorage.SetItemAsync("test", "123");
}
}
您需要将 'Session' 从单例更改为 scooped,请参考此线程: