未设置约束为何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
相关产品推荐
相关产品推荐

