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);
    

我检查了GetSet 是否按预期到达。我还检查了Set,记分卡的值是应有的。但是一旦我再次到达Get,分数就会重置为0。

ScoresHoleScoreScorecard 类上的列表,如下所示:

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() 不保存嵌套属性?的主要内容,如果未能解决你的问题,请参考以下文章