MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes 到底改变了什么?

Sup*_*Bob 1 c# model-view-controller model-validation data-annotations asp.net-core

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

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

所以,总结一下:

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

  2. 启用/禁用有任何功能差异吗MvcOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes?据我所知,它没有改变任何东西。

juu*_*nas 5

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

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

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

但是,如果启用 C# 8 可空引用类型,则可能具有如下属性:

public string A { get; set; }

public string? B { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在,设置该设置后,该A属性将获得“Required”属性。它仍然是一个引用类型并且可以为 null。因此,检查是有意义的。