首页 > 解决方案 > 如何在 .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");

标签: blazorblazor-webassembly

解决方案


您正在使用“会话”类作为“组件类”,但并非如此,将其替换为它,它应该可以工作:

 public class Session
    {
        protected readonly ILocalStorageService _localStorage;

        public Session(ILocalStorageService LocalStorage)
        {
            _localStorage = LocalStorage; 

        }

        public void updateLocalStorage()
        {
            _localStorage.SetItemAsync("test", "123");
        }
    }

您需要将“会话”从单例更改为铲起,请参阅此线程: 如何在 Blazor 服务器的后端正确使用依赖注入?


推荐阅读