.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