Blazor 6.0 等待 HttpClient.GetFromJsonAsync<List CS8601 可能的 null 引用签名

Blazor 6.0 await HttpClient.GetFromJsonAsync<List CS8601 Possible null reference asignment

提问人:Charlie Fisher 提问时间:7/19/2022 更新时间:7/19/2022 访问量:1214

问:

大家好,我在这里错过了一些相当基本的东西,我真的很感激一些指导。

我对 Blazor 和实体框架相当陌生,并且正在构建我的第一个 Blazor 应用之一

我有一个相当基本的数据类

using System.ComponentModel.DataAnnotations;

namespace BIDM2.Data
{
    public class InvalidAddressMapping
    {
        [Key]
        public int record_no { get; set; } = 0;
        public string sales_org_pos { get; set; } = " ";
        public string press_sales_mgr_code { get; set; } = " ";
        public string press_sales_mgr_Name { get; set; } =  " ";
        public string forming_sales_rep_code { get; set; } = " ";
        public string forming_sales_rep_Name { get; set; } = " ";

    }
}

我在控制器中使用的如下所示


        [HttpGet]
        public async Task <ActionResult<List<InvalidAddressMapping>>> GetInvalidAdressMappings()
        {
            return await _db.GetInvalidAddressMappings.FromSqlRaw("EXEC BIDM_GetInvalidAddressMappings;").ToListAsync();
        }

我试图像这样在我的剃须刀页面中使用它

@code {
    List<InvalidAddressMapping> invalidMappings = new List<InvalidAddressMapping>();


    protected override async Task OnInitializedAsync()
    {
            invalidMappings = await HttpClient.GetFromJsonAsync<List<InvalidAddressMapping>>(NavigationManager.BaseUri + "invalidmapping");  
    }
}

当我尝试运行我的剃刀页面时,我收到错误 CS8601 可能的空引用签名:(

我不确定我是否完全理解,我可以使用一些指导来为我指明正确的方向,它必须是我所缺少的相当基本的东西

有趣的是,这一切都是因为我试图将现有的非异步方法转换为异步方法

当我使用

  //1. get invalid address mappings  
        public InvalidAddressMapping[] GetInvalidAddressMappings() 
        {
            InvalidAddressMapping[] invMappings;
            // exec BIDM_GetInvalidAddressMappings calls the stored procedure 
            invMappings = _dbcontext.GetInvalidAddressMappings.FromSqlRaw("EXEC BIDM_GetInvalidAddressMappings;").ToArray();
            return invMappings;
        }
    }

它运行良好,我可以看到一个可爱的 JSON 数据列表

请帮助一个苦苦挣扎的老 git 出来,让我朝着一个我可以理解我哪里出错的方向前进:)

谢谢大家

entity-framework async-await blazor nullreferenceexception

评论

0赞 DavidG 7/19/2022
GetFromJsonAsync返回一个可以为 null 的类型。例如,如果它无法正确反序列化,它可能会返回 null。代码告诉您需要检查 null 响应是否安全。
0赞 T.Trassoudaine 7/19/2022
是 Blazor Server 吗?因为,如果要在服务器上的页面上使用它,最好在服务中定义它,而不是将其定义为控制器。或者两者兼而有之,如果在某些时候需要控制器。GetInvalidAdressMappings

答:

2赞 DavidG 7/19/2022 #1

GetFromJsonAsync 扩展方法返回可为 null 的类型。就你而言,它是(注意最后的额外内容)。例如,如果它无法正确反序列化,它可能会返回 null。代码告诉您需要检查 null 响应是否安全。List<InvalidAddressMapping>??

所以安全的版本是做这样的事情:

var result = await HttpClient.GetFromJsonAsync<List<InvalidAddressMapping>>(
    NavigationManager.BaseUri + "invalidmapping");

if(result == null)
{
    // Do something here to handle this error, for example:
    throw new Exception("Can't get data from the server for some reason, help!");
}

invalidMappings = result;

另请注意,您看到的 CS8601 消息是警告,而不是错误。因此,从技术上讲,您可以忽略它,尽管我强烈建议不要这样做。