• .Net Nullable reference types(可为空引用类型)


    一、前言

    在使用.Net 6创建项目开发的过程中,发现接口string类型的参数不传值的时候会返回如下错误

    "title": "One or more validation errors occurred.",

    The xxx field is required.

    二、问题

    这是一个查询列表方法,查询条件可以是空字符串,我也没有设置[Required],报400错误比较奇怪。

    排查问题:我手动给lastRecordTime给默认值,发现还需没有任何用。

    1. [HttpGet]
    2. [Route("v1/app/list")]
    3. [TokenUserContext]
    4. public async Task> GetMessageListAsync(NoticeTypeEnum noticeType, string lastRecordTime = "", int quantity = 10)
    5. {
    6. ......
    7. }

    之前用.Net 5创建的项目并没有出现这个问题,怎么到了.Net 6就出现这个问题呢;

    经过仔细排查,发现是可为空引用类型的锅,当开启了可为空引用类型,这个string 属性就编译成了[Required],所以就出现了参数校验的错误。

    <Nullable>enable

    1. <PropertyGroup>
    2. <TargetFramework>net6.0TargetFramework>
    3. <Nullable>enableNullable>
    4. PropertyGroup>

    .Net 6创建项目时,会默认在项目.csporj文件中配置开启 Nullable 可空类型,这就使得原本可以调用的API接口也许就会提示 400 BadRequest 因为传入参数不合法,模型校验失败,此时将不会进入Controller。

    三、解决方法

    1、把参数类型修改为可空类型:string?

    1. [HttpGet]
    2. [Route("v1/app/list")]
    3. [TokenUserContext]
    4. public async Task> GetMessageListAsync(NoticeTypeEnum noticeType, string lastRecordTime? = "", int quantity = 10)
    5. {
    6. ......
    7. }

    2、如果是整个项目都需要修改,那可以在Startup.cs文件的ConfigureServices方法中通过配置关闭不可为空引用类型的属性即可

    1. public void ConfigureServices(IServiceCollection services)
    2. {
    3. services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);
    4. }

    .Net 6中在Program.cs文件中添加

    builder.Services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);

    3、修改项目.csporj文件中Nullable 配置,找到enable去掉。

    1. <PropertyGroup>
    2. <TargetFramework>net6.0TargetFramework>
    3. <Nullable>enableNullable>
    4. PropertyGroup>

    四、可为空引用类型介绍

    C#8.0 引入了“可为空引用类型”和“不可为空引用类型”,使我们能够对引用类型变量的属性作出重要声明 。

    我们只需要修改C#8的项目的文件,添加enable

    在没增加这个配置之前类型前,代码长这样:

    添加完之后,编译器会对引用类型出现警告,并且生成项目时也会报告这个警告:

     当我们赋值null给属性时,也会提示

     其他的就不一一介绍了

  • 相关阅读:
    Nginx服务器安装证书并启用SSL(acme.sh)
    制作一个ros2机器人需要学习的课本(还不全面)
    2354. 优质数对的数目-排序去重,加统计
    以“降本增效”为目标,智能视频监控能为企业带来哪些经济价值?
    JAVA设计模式-单例模式
    formData文件上传与下载,文件大小转换
    vue3 props传值默认类型
    Re:从零开始的C++世界——(一)入门基础
    关于鸿蒙系统对比安卓系统的优势?
    在群晖NAS上搭建导航页_通过Web Station搭建
  • 原文地址:https://blog.csdn.net/qq_27559331/article/details/126719524