ASP.NET Core中未加Required的字符串字段为何提示必填?
这个问题的核心原因很可能是你的ASP.NET Core项目启用了**C# 8.0+的可空引用类型(Nullable Reference Types)**特性。
当启用这个特性后,C#会把默认的引用类型(比如string)视为非可空的——也就是说,编译器和ASP.NET Core的模型验证系统会默认认为这些属性必须有值,不能为null。哪怕你没有给DisplayName添加[Required]特性,模型验证也会自动为这个非可空的string属性添加必填校验规则,这就是为什么你传入null时会收到「The DisplayName field is required.」的错误提示。
而你移除[StringLength]后依然触发验证,是因为这个必填校验来自可空引用类型的默认规则,和[StringLength]特性无关——[StringLength]只负责校验字符串长度,不影响必填性判断。
针对这个问题,你有几个可选的解决方向:
1. 将属性改为可空引用类型
最直接的方式是把DisplayName的类型改为可空的string?,明确告诉编译器和模型验证系统这个属性允许为null:
public class AddConfigurationContextValueApiRequest { public int ContextId { get; set; } [Required(ErrorMessage = "Value is required to continue")] [StringLength(500, ErrorMessage = "Value can not be longer than 500 characters")] public string Value { get; set; } [StringLength(500, ErrorMessage = "Display name can not be longer than 500 characters")] public string? DisplayName { get; set; } // 改为可空类型 }
2. 显式允许属性为null
如果你不想修改属性类型,可以使用[Required(AllowNull = true)]特性,显式覆盖可空引用类型的默认校验规则:
public class AddConfigurationContextValueApiRequest { public int ContextId { get; set; } [Required(ErrorMessage = "Value is required to continue")] [StringLength(500, ErrorMessage = "Value can not be longer than 500 characters")] public string Value { get; set; } [Required(AllowNull = true)] // 允许null值 [StringLength(500, ErrorMessage = "Display name can not be longer than 500 characters")] public string DisplayName { get; set; } }
3. 关闭可空引用类型特性
如果你的项目不需要这个特性,可以修改项目文件(.csproj),找到<Nullable>配置项,将其设置为disable或者直接删除该配置:
<PropertyGroup> <!-- 其他配置 --> <Nullable>disable</Nullable> </PropertyGroup>
这确实是ASP.NET Core的有意设计——它是为了和C#的可空引用类型特性对齐,帮助开发者提前发现潜在的空引用异常,让模型验证的规则和代码中的类型声明保持一致,提升代码的健壮性。
内容的提问来源于stack exchange,提问作者Rey

