You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:14:09