ProtectedLocalStorage.SetAsync() 不保存嵌套属性?
Posted
技术标签:
【中文标题】ProtectedLocalStorage.SetAsync() 不保存嵌套属性?【英文标题】:ProtectedLocalStorage.SetAsync() doesn't save nested properties? 【发布时间】:2022-01-21 08:23:03 【问题描述】:我正在 Blazor(服务器端)开发一个高尔夫记分卡网络应用程序。我希望它执行以下操作之一:
第一次渲染时,它应该从本地存储加载记分卡(如果有的话)。 在所有后续渲染(更改)中,它应该将记分卡保存到本地存储中,以便始终使用最新值进行更新。我的代码:
protected override async Task OnAfterRenderAsync(bool firstRender)
if (firstRender)
Console.WriteLine("Loading scorecard from local storage...");
var result = await ProtectedLocalStorage.GetAsync<Scorecard>("scorecard");
if (result.Success)
scorecard = result.Value;
StateHasChanged();
else
Console.WriteLine("Saving scorecard to local storage...");
if (scorecard != null)
await ProtectedLocalStorage.SetAsync("scorecard", scorecard);
我检查了Get
和Set
是否按预期到达。我还检查了Set
,记分卡的值是应有的。但是一旦我再次到达Get
,分数就会重置为0。
Scores
是HoleScore
在Scorecard
类上的列表,如下所示:
public class Scorecard
(...)
public List<HoleScore> Scores get; = new List<HoleScore>();
public record HoleScore
public Guid PlayerId get; set;
public int HoleNumber get; set;
public int NumberOfStrokes get; set;
每次加载时将值NumberOfStrokes
重置为零(或者可能从未保存)。这是为什么呢?
【问题讨论】:
分号是错字,已被删除:-) 【参考方案1】:(de)seializer 需要能够设置属性。
//public List<HoleScore> Scores get; = new List<HoleScore>();
public List<HoleScore> Scores get; set; = new List<HoleScore>();
或者,就像在 cmets 中出现的那样:
public List<HoleScore> Scores get; init; = new List<HoleScore>();
提供意外访问。
【讨论】:
这听起来是个合理的建议。一旦我再次在电脑前,我会尝试一下。但如果是这样的话,。为什么没有任何错误或警告? JSON 序列化器追求的是灵活性,而不是验证。 酷,它有效。谢谢您的帮助。奖励信息:它也适用于init
。
解串器是否与internal set;
一起工作?我不喜欢“仅用于”序列化程序的公共访问。
@user2864740:不,但您可以将set;
替换为init;
以获得或多或少相同的保护。以上是关于ProtectedLocalStorage.SetAsync() 不保存嵌套属性?的主要内容,如果未能解决你的问题,请参考以下文章