diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpMvcAttributeValidationResultProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpMvcAttributeValidationResultProvider.cs new file mode 100644 index 0000000000..c6a280cca3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpMvcAttributeValidationResultProvider.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.Validation; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Validation; + +namespace Volo.Abp.AspNetCore.Mvc.Localization +{ + [Dependency(ReplaceServices = true)] + public class AbpMvcAttributeValidationResultProvider : DefaultAttributeValidationResultProvider + { + private readonly AbpMvcDataAnnotationsLocalizationOptions _abpMvcDataAnnotationsLocalizationOptions; + private readonly IStringLocalizerFactory _stringLocalizerFactory; + + public AbpMvcAttributeValidationResultProvider( + IOptions abpMvcDataAnnotationsLocalizationOptions, + IStringLocalizerFactory stringLocalizerFactory) + { + _abpMvcDataAnnotationsLocalizationOptions = abpMvcDataAnnotationsLocalizationOptions.Value; + _stringLocalizerFactory = stringLocalizerFactory; + } + + public override ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext) + { + var resourceSource = _abpMvcDataAnnotationsLocalizationOptions.AssemblyResources.GetOrDefault(validationContext.ObjectType.Assembly); + if (resourceSource == null) + { + return base.GetOrDefault(validationAttribute, validatingObject, validationContext); + } + + if (validationAttribute.ErrorMessage == null) + { + ValidationAttributeHelper.SetDefaultErrorMessage(validationAttribute); + } + + if (validationAttribute.ErrorMessage != null) + { + validationAttribute.ErrorMessage = _stringLocalizerFactory.Create(resourceSource)[validationAttribute.ErrorMessage]; + } + + return base.GetOrDefault(validationAttribute, validatingObject, validationContext); + } + } +} diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs index ae016e6954..912f68e4af 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Reflection; @@ -120,9 +121,10 @@ namespace Volo.Abp.Validation MemberName = property.Name }; + var attributeValidationResultProvider = ServiceProvider.GetRequiredService(); foreach (var attribute in validationAttributes) { - var result = attribute.GetValidationResult(property.GetValue(validatingObject), validationContext); + var result = attributeValidationResultProvider.GetOrDefault(attribute, property.GetValue(validatingObject), validationContext); if (result != null) { errors.Add(result); diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DefaultAttributeValidationResultProvider.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DefaultAttributeValidationResultProvider.cs new file mode 100644 index 0000000000..f60a695b65 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DefaultAttributeValidationResultProvider.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Validation +{ + public class DefaultAttributeValidationResultProvider : IAttributeValidationResultProvider, ITransientDependency + { + public virtual ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext) + { + return validationAttribute.GetValidationResult(validatingObject, validationContext); + } + } +} diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IAttributeValidationResultProvider.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IAttributeValidationResultProvider.cs new file mode 100644 index 0000000000..a5fa367092 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IAttributeValidationResultProvider.cs @@ -0,0 +1,9 @@ +using System.ComponentModel.DataAnnotations; + +namespace Volo.Abp.Validation +{ + public interface IAttributeValidationResultProvider + { + ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext); + } +}