在 Blazor WebAssembly 应用程序的会话存储中保存自定义对象(使用 Blazored.SessionStorage)

Save custom objects in session storage in Blazor WebAssembly application (using Blazored.SessionStorage)

我正在尝试将我创建的 classes 的一些对象保存到我的 Blazor Wasm 应用程序的会话存储中,以在刷新 (F5) 后保存状态。我遵循了 Bradley Wells (https://wellsb.com/csharp/aspnet/blazor-write-to-localstorage/) 的教程,并假设如果我使用会话存储而不是本地存储,一切都会类似。

如果我使用像字符串这样的基本数据类型尝试我的代码,它就像一个魅力,在刷新页面后仍然显示值“testmessage”。

protected override async Task OnInitializedAsync()
{
    testString = await sessionStorage.GetItemAsync<string>("sample");
}

// Method gets triggered on button press
async Task TestMethodCanBeDeleted()
{
    testString = "testmessage";
    await sessionStorage.SetItemAsync<string>("sample", testString);
}

一旦我尝试保存,例如class MyCustomObject 的实例而不是字符串,它不再起作用了。我是否必须首先在会话存储中创建 class 的实例?如果是,如何。

如果有人知道如何在会话存储中保存“非基本”数据类型的另一种(甚至更好)方法,请发表评论。

编辑:Bradley Wells 在他的页面上回答了一条评论,写道可以使用 Blazored 将对象保存到会话存储中,但没有解释如何操作。

您需要将您的对象转换为 json 或任何其他字符串格式,以便它可以保存在会话中。当您取回它时,您可以将 json 转换为您的对象。

要转换为 json,您可以使用 Newtonsoft Json.NET

using Newtonsoft.Json;

将对象转换为字符串:

string json = JsonConvert.SerializeObject(myCustomObject);
await sessionStorage.SetItemAsync<string>("sample", json);

将字符串转换为对象:

json = await sessionStorage.GetItemAsync<string>("sample");
MyCustomObject myCustomObject = JsonConvert.DeserializeObject<MyCustomObject>(json);

你也可以使用新的.net核心System.Text.Json

using System.Text.Json;
using System.Text.Json.Serialization;

将对象转换为字符串:

string json = JsonSerializer.ToString<MyCustomObject>(myCustomObject);
await sessionStorage.SetItemAsync<string>("sample", json);

将字符串转换为对象:

json = await sessionStorage.GetItemAsync<string>("sample");
MyCustomObject myCustomObject = JsonSerializer.Parse<MyCustomObject>(json);