如何在.NET ValidateDataAnnotations中简化IOptions验证错误消息
解决方案
默认的ValidateDataAnnotations()生成的错误消息格式是固定的,没有直接配置项可以移除前缀。不过可以通过两种方式实现你要的效果:
一、自定义验证逻辑(推荐)
替换原有的ValidateDataAnnotations(),手动执行数据注解验证并构造自定义的错误消息:
services.AddOptions<ConnectionOptions>() .Bind(Configuration.GetSection("ConnectionStrings")) .Validate(options => { var validationContext = new ValidationContext(options); var validationResults = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject( options, validationContext, validationResults, validateAllProperties: true ); if (!isValid) { // 仅提取我们定义的错误消息 var errorMessages = validationResults.Select(r => r.ErrorMessage); throw new OptionsValidationException( typeof(ConnectionOptions).FullName, typeof(ConnectionOptions), errorMessages ); } return isValid; });
这样抛出的OptionsValidationException的Failures集合中,就只会包含你定义的Field Connection is required,不会有额外前缀。
二、捕获异常后处理(正则截取)
如果不想修改验证逻辑,也可以在捕获异常时用正则提取目标消息:
try { var options = serviceProvider.GetRequiredService<IOptions<ConnectionOptions>>().Value; } catch (OptionsValidationException ex) { var cleanErrors = ex.Failures.Select(f => System.Text.RegularExpressions.Regex.Match(f, @"Field .+ is required").Value); // 处理清理后的错误消息 }
内容的提问来源于stack exchange,提问作者obratim
相关产品推荐
相关产品推荐

