You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core为何标记未设置为必填的表单字段为必填项?

解决.NET 6 + Fluent Validation中非必填字段自动提示必填的问题

这个问题我之前也碰到过,根源其实是.NET 6默认启用的**Nullable Reference Types(可空引用类型,简称NRT)**特性在起作用,和Fluent Validation本身的配置关系不大。

为什么会出现这个问题?

在.NET 6及后续版本的项目中,NRT是默认开启的。当你的模型字段定义为非可空引用类型(比如public string Description { get; set; })时,ASP.NET Core的模型绑定系统会自动为这类字段添加隐式的[Required]验证规则——也就是说,哪怕你没在Fluent Validation里设置必填规则,提交空值时依然会触发"The Description field is required"的错误。

具体解决方案(选其一即可)

1. 将模型字段改为可空引用类型(最推荐)

直接在字段类型后加?,把它标记为可空:

public class ProductModel {
    public string? Description { get; set; }
    // ...其他字段
}

这样模型绑定系统就不会自动添加必填验证,Fluent Validation里定义的Length(0,200)规则就能正常生效,空值也会被允许通过。

2. 全局禁用NRT的隐式必填验证

如果你不想修改模型的可空性,可以在Program.cs中配置MVC选项,关闭自动为非可空引用类型生成[Required]的行为:

builder.Services.AddControllersWithViews(options => {
    // 禁用非可空引用类型的隐式必填验证
    options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true;
});

这样所有非可空引用类型的字段都不会被默认标记为必填,完全交给Fluent Validation来控制验证规则。

3. 为单个字段添加[AllowNull]属性

如果只想针对特定字段关闭默认验证,可以在字段上添加[AllowNull]属性:

public class ProductModel {
    [AllowNull]
    public string Description { get; set; }
    // ...其他字段
}

这种方式适合只需要调整个别字段验证规则的场景。

额外确认:确保Fluent Validation正确注册

最后别忘了确认你已经在Program.cs中正确注册了Fluent Validation服务和自定义验证器:

// 启用Fluent Validation自动验证和客户端适配
builder.Services.AddFluentValidationAutoValidation()
                .AddFluentValidationClientsideAdapters();

// 注册你的自定义验证器
builder.Services.AddScoped<IValidator<ProductModel>, ModelValidator>();

这样配置完成后,空的Description字段就只会在输入内容超过200字符时触发你定义的长度验证,而不会再弹出默认的必填错误了。

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

火山引擎 最新活动