Blazor JS-Interop 浏览器本地存储对 IJSRuntime.InvokeAsync<T> 的调用在尝试处理空输入时遇到异常

问题描述

我一直在玩 Blazor JS-Interop 方面,对此我有些困惑。这是我所拥有的:

  1. 在本地 .js 文件中定义的函数 - 其目的只是为了 a) 在浏览器本地存储中查找参数并在找到时返回它或如果未找到则返回 null 并且 b) 在浏览器本地存储
    function () { window.blazorStorage = {
        get: key => key in localStorage ? JSON.parse(localStorage[key]) : null,set: (key,value) => { localStorage[key] = JSON.stringify(value); }
        } };
  1. 使用上述 getter 的 C# 代码函数
private readonly IJSRuntime jsRuntime;

public async Task<T> GetProperty<T>(string propName) 
=> await this.jsRuntime.InvokeAsync<T>("blazorStorage.get",propName);

这个问题是 - 在这种情况下调用 jsRuntime.InvokeAsync 遇到了抱怨以下内容的异常:

Error: Microsoft.JSInterop.JSException: An exception occurred executing JS interop: 
Null object cannot be converted to a value type..

就我而言,我正在寻找整数类型的参数。然而,就通用函数的全部意义而言 - 它可能是任何 JSON 可序列化的东西。

我脑子里的困境是 - 一方面,我有点理解这种关于无法将 null 转换为值类型的抱怨来自哪里 - 另一方面 - 好吧,如果我们是通用的 - 我们不应该准备处理空值,因为它是来自 JS 端的有效选项 - 不能保证总会有一个值。

我在网上找不到太多关于类似问题的信息,这让我觉得我在这里可能做错了,忽略了明显的问题。

我可以通过一个非常简单的 try/catch 来解决这个问题

    public async Task<T> GetProperty<T>(string propName)
            {
                try
                {
                    return await this.jsRuntime.InvokeAsync<T>("blazorStorage.get",propName);
                }
                catch (Exception)
                {
                    return default;
                }           
            }

但是,jsRuntime.InvokeAsync 不能自然地处理可空值仍然有些奇怪。

在这里做错了吗?非常感谢任何聪明的想法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)