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

Fluent Validation:.NET7项目中如何移除默认错误消息

解决Fluent Validation自定义校验时的多余空消息问题

你遇到的问题根源在于:使用Must规则时,只要返回false,Fluent Validation就会自动添加一条默认失败消息——哪怕你已经通过context.AddFailure添加了自定义消息。设置WithMessage(_ => string.Empty)只是把默认消息改成空字符串,但这条空消息依然会存在。

要彻底解决这个问题,推荐使用**Custom规则**代替Must,因为Custom允许你完全控制校验逻辑和失败消息的生成,不会自动添加任何默认消息。

修改后的代码如下:

RuleFor(x => x.Number)
.Cascade(CascadeMode.Stop)
.Custom((number, context) =>
{
    // 将YourModelType替换为你的实体类类型
    var model = context.InstanceToValidate as YourModelType;
    if (model == null) return;

    var (isValid, isFirstMessage) = IsValidNumber(model.Unit, number);

    if (!isValid)
    {
        context.AddFailure(nameof(model.Number),
            isFirstMessage 
            ? "My first message"
            : "My second message");
    }
});

为什么这个方案有效?

Custom规则专门用于处理复杂自定义校验场景:

  1. 可通过context.InstanceToValidate获取完整模型实例,无需依赖Must的多参数重载
  2. 只有主动调用context.AddFailure时才会添加失败消息,框架不会自动生成默认消息
  3. 逻辑更集中,不需要额外的WithMessage设置覆盖默认内容

如果坚持使用Must规则,也可以用以下方式优化(但会导致IsValidNumber执行两次,不推荐):

RuleFor(x => x.Number)
.Cascade(CascadeMode.Stop)
.Must((model, number) => IsValidNumber(model.Unit, number).isValid)
.WithMessage((model, number) => 
    IsValidNumber(model.Unit, number).isFirstMessage 
    ? "My first message" 
    : "My second message");

这种方式直接通过WithMessage动态生成自定义消息,不再手动调用context.AddFailure,框架只会返回你定义的这条消息,不会额外添加默认内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:36:24