Blazor WebAssembly **Microsoft.JSInterop.JSException** Error: The value 'sessionStorage.length' is not a function

Blazor WebAssembly **Microsoft.JSInterop.JSException** Error: The value 'sessionStorage.length' is not a function

从基本的角度来看,我正在尝试做的是从会话存储中获取密钥列表(密钥名称)。

我尝试这样做的方法是调用 JsRuntime.InvokeAsync 方法来:

  1. 获取session存储中key的个数,

  2. 循环计算会话存储中的项目数并获取键名。

     public async Task<List<string>> GetKeysAsync()
     {
         var dataToReturn = new List<string>();
    
    
         var storageLength = await JsRuntime.InvokeAsync<string>("sessionStorage.length");
    
         if (int.TryParse(storageLength, out var slength))
         {
    
             for (var i = 1; i <= slength; i++)
             {
                 dataToReturn.Add(await JsRuntime.InvokeAsync<string>($"sessionStorage.key({i})"));
             }
         }
    
         return dataToReturn;
     }
    

调用 JsRuntime.InvokeAsync($"sessionStorage.length")) 或 JsRuntime.InvokeAsync($"sessionStorage.key(0)")) 时出现错误“值 'sessionStorage.length' 不是函数。”或值 'sessionStorage.key(0)' 不是函数。

我可以使用会话存储中的密钥名称获取单个项目,而不会出现以下示例中的问题。

    public async Task<string> GetStringAsync(string key)
    {
        return await JsRuntime.InvokeAsync<string>("sessionStorage.getItem", key);
    }

当我在 Chrome 控制台中使用 .length 或 .key(0) 时,它们按预期工作,但在使用 JsRuntime 时却没有。

我能够在不使用 sessionStorage.length 属性 的情况下使它工作。我对解决方案不是 100% 满意,但它确实可以按需工作。

请看下面的代码。 .key 的主要内容是在 InvokeAsync 方法中将计数用作单独的变量。

我认为这是因为 JsRuntime.InvokeAsync 方法自动将 () 添加到请求的末尾,所以 sessionStorage.length 变成了 sessionStorage.length() 因此将不起作用. sessionStorage.key(0) 变成了 sessionStorage.key(0)()。等等。这只是一个猜测。

    public async Task<List<string>> GetKeysAsync()
    {
        var dataToReturn = new List<string>();

        var dataPoint = "1";

        while (!string.IsNullOrEmpty(dataPoint) )
        {
            dataPoint = await JsRuntime.InvokeAsync<string>($"sessionStorage.key", $"{dataToReturn.Count}");

            if (!string.IsNullOrEmpty(dataPoint))
                dataToReturn.Add(dataPoint);
        }

        return dataToReturn;
    }