定制本地化的默认验证错误消息

 

.net core 模型验证的本地化

 创建一个类

现在建立一个类,添加字段限制说明。

public class ChatMessage
    {
        [Required]
        [DisplayName("用户名")]
        [MinLength(10)]
        public string UserName { get; set; }

        [DisplayName("内容")]
        [MaxLength(50)]
        [MinLength(10)]
        public string Content { get; set; }

        [Required]
        [DisplayName("发送时间")]
        public DateTime SendedTime { get; set; }

        [DisplayName("客户端名称")]
        [EmailAddress]
        [Phone]
        public string ClientName { get; set; }


        //[DisplayName("编码")]
        [Range(10, 50)]
        public int Code { get; set; }
    }

 

初始环境效果

现在想要将默认的错误提示语句改为中文提示。

当然如果每个都写ErrorMessage话,错误提示也会直接读取ErrorMessage中编辑的内容,但是比较累。

 

第一步添加资源文件

 

 

 

第二步添加自己的验证信息

public class CustomValidationMetadataProvider : IValidationMetadataProvider
    {
        private ResourceManager resourceManager; private Type resourceType;
        public CustomValidationMetadataProvider(string baseName, Type type)
        {
            resourceType = type;
            resourceManager = new ResourceManager(baseName, type.GetTypeInfo().Assembly);
        }
        public void CreateValidationMetadata(
            ValidationMetadataProviderContext context)
        {
            if (context.Key.ModelType.GetTypeInfo().IsValueType &&
                context.ValidationMetadata.ValidatorMetadata
                    .Where(m => m.GetType() == typeof(RequiredAttribute)).Count() == 0)
                context.ValidationMetadata.ValidatorMetadata.
                    Add(new RequiredAttribute());
            foreach (var attribute in context.ValidationMetadata.ValidatorMetadata)
            {
                ValidationAttribute tAttr = attribute as ValidationAttribute;
                if (tAttr != null/* && tAttr.ErrorMessage == null*/&& tAttr.ErrorMessageResourceName == null)
                {
                    var name = tAttr.GetType().Name;
                    if (resourceManager.GetString(name) != null)
                    {
                        tAttr.ErrorMessageResourceType = resourceType;
                        tAttr.ErrorMessageResourceName = name;
                        tAttr.ErrorMessage = null;
                    }
                }
            }
        }
    }

 

第三步Startup中配置

 services.AddControllers(options =>
            {
                options.ModelMetadataDetailsProviders.Add(new CustomValidationMetadataProvider("UtilPack.SiteResources", typeof(SiteResources)));
            });

 

结果展示

 

 

备注说明

关于 tAttr.ErrorMessage == null 这一句的问题。

PhoneAttribute和EmailAddressAttribute等的ErrorMessage不是null 。它的值和ErrorMessageString 相同。

MinLengthAttribute,MaxLengthAttribute,RangeAttribute 和RequiredAttribute 的 ErrorMessage是null 和ErrorMessageString 不同

参考资料

https://docs.microsoft.com/zh-cn/archive/blogs/mvpawardprogram/aspnetcore-mvc-error-message

 

posted @ 2020-12-18 17:33  芝幽幽  阅读(646)  评论(0编辑  收藏  举报