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规则专门用于处理复杂自定义校验场景:
- 可通过
context.InstanceToValidate获取完整模型实例,无需依赖Must的多参数重载 - 只有主动调用
context.AddFailure时才会添加失败消息,框架不会自动生成默认消息 - 逻辑更集中,不需要额外的
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
相关产品推荐
相关产品推荐

