如何移除FluentValidation错误消息中的‘Severity: Error’后缀?
FluentValidation 11.9.0 升级问题解决指南
移除错误消息的「Severity: Error」后缀
完全可以关闭这个后缀,不用扩展异常类,直接通过自定义异常工厂绕过默认的消息拼接逻辑:
- 单个验证器配置:在你的
AbstractValidator子类里设置ValidationExceptionFactory,直接传入原始错误消息列表,跳过BuildErrorMessage的拼接:
public class YourModelValidator : AbstractValidator<YourModel> { public YourModelValidator() { // 这里写你的验证规则 // 自定义异常工厂,避免添加Severity后缀 ValidationExceptionFactory = (context, errors) => new ValidationException(errors.Select(e => e.ErrorMessage)); } }
- 全局配置:如果所有验证都需要移除这个后缀,直接全局设置:
ValidatorOptions.Global.ValidationExceptionFactory = (context, errors) => new ValidationException(errors.Select(e => e.ErrorMessage));
原理:默认的ValidationException构造函数会调用BuildErrorMessage拼接后缀,但直接传入错误消息数组的构造函数不会触发这个逻辑,直接用原始消息创建异常。
修复空PropertyName导致的「-- :」格式&优化属性名显示
解决空PropertyName的怪异格式
自定义验证时,不要依赖默认的PropertyName自动拼接,直接控制消息内容:
比如在自定义验证逻辑里,直接输出完整消息,不包含PropertyName:
RuleFor(x => x) .Custom((model, context) => { if (/* 你的验证条件不满足 */) { // 直接添加不带属性名的错误消息 context.AddFailure("请填写必要信息"); // 如果需要关联属性但不想显示名称,也可以传空字符串作为属性名 // context.AddFailure(string.Empty, "请填写必要信息"); } });
优化属性名的用户友好性
有两种方式:
- 单个规则设置友好名称:用
WithName给特定属性替换成用户能看懂的名称:
RuleFor(x => x.UserName) .NotEmpty() .WithName("用户名");
- 全局配置自动解析友好名称:比如利用
DisplayNameAttribute,全局设置解析器:
ValidatorOptions.Global.DisplayNameResolver = (type, member, expr) => member?.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName ?? member?.Name;
之后只要给模型属性加[DisplayName("用户名")],验证消息里就会自动显示这个友好名称,不用每个规则都设置。
关于你尝试重写RaiseValidationException的补充
不用去扩展异常类,替换ValidationExceptionFactory是更简单的方案——RaiseValidationException内部最终会调用这个工厂方法,自定义工厂直接绕过了默认的消息拼接逻辑,完全不需要修改异常类的构造函数。
内容的提问来源于stack exchange,提问作者boggy
相关产品推荐
相关产品推荐

