using NCC.Dependency; using NCC.FriendlyException; using Microsoft.AspNetCore.Http; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text.RegularExpressions; namespace NCC.DataValidation { /// /// 数据验证拓展类 /// [SuppressSniffer] public static class DataValidationExtensions { /// /// 拓展方法,验证类类型对象 /// /// 对象实例 /// 是否验证所有属性 /// 验证结果 public static DataValidationResult TryValidate(this object obj, bool validateAllProperties = true) { return DataValidator.TryValidateObject(obj, validateAllProperties); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 验证特性 /// public static DataValidationResult TryValidate(this object value, params ValidationAttribute[] validationAttributes) { return DataValidator.TryValidateValue(value, validationAttributes); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 验证类型 /// public static DataValidationResult TryValidate(this object value, params object[] validationTypes) { return DataValidator.TryValidateValue(value, validationTypes); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 验证逻辑 /// 验证类型 /// public static DataValidationResult TryValidate(this object value, ValidationPattern validationOptionss, params object[] validationTypes) { return DataValidator.TryValidateValue(value, validationOptionss, validationTypes); } /// /// 拓展方法,验证类类型对象 /// /// 对象实例 /// 是否验证所有属性 public static void Validate(this object obj, bool validateAllProperties = true) { DataValidator.TryValidateObject(obj, validateAllProperties).ThrowValidateFailedModel(); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 验证特性 public static void Validate(this object value, params ValidationAttribute[] validationAttributes) { DataValidator.TryValidateValue(value, validationAttributes).ThrowValidateFailedModel(); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 验证类型 public static void Validate(this object value, params object[] validationTypes) { DataValidator.TryValidateValue(value, validationTypes).ThrowValidateFailedModel(); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 验证逻辑 /// 验证类型 public static void Validate(this object value, ValidationPattern validationOptionss, params object[] validationTypes) { DataValidator.TryValidateValue(value, validationOptionss, validationTypes).ThrowValidateFailedModel(); } /// /// 拓展方法,验证单个值 /// /// 单个值 /// 正则表达式 /// 正则表达式选项 /// public static bool TryValidate(this object value, string regexPattern, RegexOptions regexOptions = RegexOptions.None) { return DataValidator.TryValidateValue(value, regexPattern, regexOptions); } /// /// 直接抛出异常信息 /// /// public static void ThrowValidateFailedModel(this DataValidationResult dataValidationResult) { if (!dataValidationResult.IsValid) { // 解析验证失败消息,输出统一格式 var validationFailMessage = dataValidationResult.ValidationResults .Select(u => new { MemberNames = u.MemberNames.Any() ? u.MemberNames : new[] { $"{dataValidationResult.MemberOrValue}" }, u.ErrorMessage }) .OrderBy(u => u.MemberNames.First()) .GroupBy(u => u.MemberNames.First()) .ToDictionary(x => x.Key, u => u.Select(c => c.ErrorMessage).ToArray()); // 抛出验证失败异常 throw new AppFriendlyException(default, default, new ValidationException()) { StatusCode = StatusCodes.Status400BadRequest, ValidationException = true, ErrorMessage = validationFailMessage, }; } } } }