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

未设置约束为何ModelState仍无效?ASP.NET Core验证疑问

问题

我的BookingViewModel里没给FirstName、LastName加任何约束,但提交表单到Create控制器时,只要没输入这两个字段就会触发ModelState无效,弹出默认错误“First Name is required”,这和我设置的Fluent Validation规则冲突,请问这是为什么?

ViewModel代码

public class BookingViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }        
    public DateTime CheckInDate { get; set; }
    public DateTime CheckOutDate { get; set; }
    
    // 用于显示用户选择的房型
    public RoomTypeDTO? RoomType { get; set; }
    public int RoomTypeId { get; set; }
}

视图代码片段

<div>
    <label asp-for="FirstName"></label>
    <input asp-for="FirstName" class="col-xs-4"/>
    <span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<br />
<div>
    <label asp-for="LastName"></label>
    <input asp-for="LastName" class="col-xs-4" />
    <span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div>.......
原因分析
  • Nullable引用类型自动触发必填验证:如果你的项目开启了Nullable引用类型(项目文件里有<Nullable>enable</Nullable>配置),那么string类型会被默认当成非可空引用类型。当表单提交空值时,ASP.NET Core的默认模型绑定系统会自动添加验证错误,提示该字段必填,这和你手动设置的Fluent Validation规则没关系。
  • 默认模型验证先于Fluent Validation执行:ASP.NET Core的默认模型验证(包括Nullable引用类型的验证)会在Fluent Validation之前运行,所以就算你用Fluent Validation定义了自定义规则,系统默认的必填错误会先被触发,导致你看到的是系统提示而非自定义规则的错误。
  • 标签助手自动生成前端验证属性:用asp-for标签助手生成输入框时,会根据模型的非可空类型自动添加HTML的required属性,前端也会触发必填校验,进一步导致这个问题出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:45:40