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

为何未标记[Required]的ViewModel字符串字段被判定为必填项?

问题分析与解决方案

这个问题的核心原因大概率是**Nullable引用类型(Nullable Reference Types)**的启用差异导致的,下面详细拆解:

为什么会出现这个问题?

从ASP.NET Core 3.0开始,当项目启用了Nullable引用类型(在.csproj文件中设置<Nullable>enable</Nullable>)时,框架会自动对非可空的引用类型字段应用[Required]验证规则——即使你没有手动添加这个特性。

看你的LoginViewModel:

public string ReturnUrl { get; set; }

这里的string是非可空引用类型(启用Nullable后,默认的string等价于string!,即非空约束)。当请求中没有传入ReturnUrl的值时,模型绑定会认为这个字段必须有值,因此自动生成必填验证错误。

而你提到另一个项目运行正常,很大概率是那个项目没有启用Nullable引用类型,此时string默认是可空的,框架不会自动添加必填验证规则。

如何解决?

你可以根据需求选择以下方案:

方案1:将ReturnUrl改为可空字符串

这是最直接的方式,明确标记该字段为可选:

public string? ReturnUrl { get; set; }

这样即使启用了Nullable,框架也会识别它是可选字段,不会自动触发必填验证。

方案2:关闭Nullable引用类型

如果不需要整个项目启用Nullable,可以修改项目的.csproj文件,将Nullable配置改为禁用:

<Nullable>disable</Nullable>

或者直接移除这个配置项,恢复到传统的可空引用类型行为。

方案3:添加[AllowNull]特性

如果你想保持string类型不变,但允许它为空,可以添加[AllowNull]特性:

[AllowNull]
public string ReturnUrl { get; set; }

这个特性会告诉框架,即使该字段是non-nullable类型,也允许它接收null值,不会触发必填验证。

验证你的情况

你可以检查当前项目的.csproj文件,看看是否包含<Nullable>enable</Nullable>配置,再对比另一个正常项目的配置,就能确认是不是这个原因了。

内容的提问来源于stack exchange,提问作者MarredCheese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:58:09