MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes 究竟改变了什么?

What exactly does MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes change?

据我了解,当 MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes 设置为 false 时,值类型隐式具有 [Required] 属性。但坦率地说,当我在两者之间切换时,我看不出有什么区别。

此外,如果我在不可空类型(例如 int 上显式使用 [Required] 属性,它将 要求 我设置它的值,而不是仅仅在没有给定 int 参数的情况下击中端点,这将为其类型分配一个默认值 - 0.

所以,总结一下:

  1. 如果隐式添加 [Required] 属性,为什么显式变体提供完全不同的功能?

  2. enabling/disablingMvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes在功能上有区别吗?据我所知,它没有改变任何东西。

我实际上还没有尝试过这个设置,但我认为线索就在名称中:SuppressImplicitRequiredAttributeForNonNullableReferenceTypes.

听起来它不适用于值类型。 它适用于不可为 null 的引用类型。

如您所说,类型为 int 的 属性 将始终具有默认值,模型验证器不知道该值是否丢失或是否设置为该值。

但是,如果您启用 C# 8 可为空的引用类型, 你可以有这样的属性:

public string A { get; set; }

public string? B { get; set; }

现在使用该设置设置 A 属性 获得 Required 属性。 它仍然是一个引用类型,可以为空。 因此检查是有意义的。