数组在 ASP.NET 6 中创建验证错误

Array creates validation error in ASP.NET 6

我在将我的 WebApi 项目更改为使用 .NET 6 而不是 .NET Core 3.1 作为我的数组查询参数类型时发现验证错误。以前他们没有 return 验证错误,但在 6.0 中他们有。

我有以下 class 查询:

public class Query
{
    public List<string> Id { get; set; }
}

以及具有以下端点的控制器:

[HttpGet()]
public IActionResult Get([FromQuery] Test2 test)
{
    return Ok()
}

当我发送不带任何查询参数的查询时,我收到一个 BadRequest,在使用 .NET 6 实现时将字段 ID 标记为必需。当使用 .NET Core 3.1 (或 5.0),方法正确执行。

为了重现,我已经使用 .NET Core 3.1、5.0 和 6.0 创建了一个 ASP.NET Core WebApi 项目,并添加了一个控制器端点,其中包含一个包含字符串数组的查询实体,如上例所示,没有任何其他变化。

坦率地说,我对此有点困惑。我尝试手动为 System.ComponentModel 执行验证程序,但这产生了预期的结果(没有错误)。我没有在脚手架上添加任何可以解释这种行为的东西,它基本上是相同的。我在 .NET 6.0 的重大更改列表中也没有发现任何提及。

向 Id 添加自定义验证属性(“NotRequired”)属性 修复了该行为,但是我更希望能够保持查询模型原样,因为它以前可以工作,而 ComponentModel 不会'显示任何错误。

来自docs

The validation system treats non-nullable parameters or bound properties as if they had a [Required(AllowEmptyStrings = true)] attribute. By enabling Nullable contexts, MVC implicitly starts validating non-nullable properties or parameters as if they had been attributed with the [Required(AllowEmptyStrings = true)] attribute.

您可以使 属性 成为可为空的引用类型,这样它会使 Id 成为可选的:

public class Query
{
    public List<string>? Id { get; set; }
}

或者您可以完全禁用可为 null 的上下文分析,这也会恢复到旧行为(所以我个人建议不要这样做)。