MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes 究竟改变了什么?
What exactly does MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes change?
据我了解,当 MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes
设置为 false
时,值类型隐式具有 [Required]
属性。但坦率地说,当我在两者之间切换时,我看不出有什么区别。
此外,如果我在不可空类型(例如 int
上显式使用 [Required]
属性,它将 要求 我设置它的值,而不是仅仅在没有给定 int
参数的情况下击中端点,这将为其类型分配一个默认值 - 0
.
所以,总结一下:
如果隐式添加 [Required]
属性,为什么显式变体提供完全不同的功能?
enabling/disablingMvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes
在功能上有区别吗?据我所知,它没有改变任何东西。
我实际上还没有尝试过这个设置,但我认为线索就在名称中:SuppressImplicitRequiredAttributeForNonNullableReferenceTypes.
听起来它不适用于值类型。
它适用于不可为 null 的引用类型。
如您所说,类型为 int
的 属性 将始终具有默认值,模型验证器不知道该值是否丢失或是否设置为该值。
但是,如果您启用 C# 8 可为空的引用类型,
你可以有这样的属性:
public string A { get; set; }
public string? B { get; set; }
现在使用该设置设置 A
属性 获得 Required 属性。
它仍然是一个引用类型,可以为空。
因此检查是有意义的。
据我了解,当 MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes
设置为 false
时,值类型隐式具有 [Required]
属性。但坦率地说,当我在两者之间切换时,我看不出有什么区别。
此外,如果我在不可空类型(例如 int
上显式使用 [Required]
属性,它将 要求 我设置它的值,而不是仅仅在没有给定 int
参数的情况下击中端点,这将为其类型分配一个默认值 - 0
.
所以,总结一下:
如果隐式添加
[Required]
属性,为什么显式变体提供完全不同的功能?enabling/disabling
MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes
在功能上有区别吗?据我所知,它没有改变任何东西。
我实际上还没有尝试过这个设置,但我认为线索就在名称中:SuppressImplicitRequiredAttributeForNonNullableReferenceTypes.
听起来它不适用于值类型。 它适用于不可为 null 的引用类型。
如您所说,类型为 int
的 属性 将始终具有默认值,模型验证器不知道该值是否丢失或是否设置为该值。
但是,如果您启用 C# 8 可为空的引用类型, 你可以有这样的属性:
public string A { get; set; }
public string? B { get; set; }
现在使用该设置设置 A
属性 获得 Required 属性。
它仍然是一个引用类型,可以为空。
因此检查是有意义的。