c# - 如何从“自定义属性”翻译“ErrorMessage”
问题描述
我创建了一个自定义验证属性,它仅验证CPF属性是否是有效的 CPF,但是当我本地化应用程序时,我注意到我的自定义属性没有由框架本地化其消息,这与数据属性Required
的消息位置正确不同:
使用正确本地化所需属性的示例。
[Required(ErrorMessage = "CPF Requerido")]
[CPF(ErrorMessage = "CPF Inválido")]
public string CPF { get; set; }
在 Startup.cs 文件中设置位置
services
.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization(options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) =>
{
return factory.Create(typeof(SharedResource));
};
});
自定义验证类:
public class CPFAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext context)
{
//Omitted for not being part of the context
}
}
版本:
Microsoft.AspNetCore.App (2.1.1)
Microsoft.NETCore.App (2.1)
解决方案
实现属性适配器:
public class CPFAttributeAdapter : AttributeAdapterBase<CPFAttribute>
{
public CPFAttributeAdapter(CPFAttributeattribute, IStringLocalizer stringLocalizer) : base(attribute, stringLocalizer) { }
public override void AddValidation(ClientModelValidationContext context) { }
public override string GetErrorMessage(ModelValidationContextBase validationContext)
{
return GetErrorMessage(validationContext.ModelMetadata, validationContext.ModelMetadata.GetDisplayName());
}
}
并实现 Attribute Adapter Provider:
public class CPFAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
private readonly IValidationAttributeAdapterProvider _baseProvider = new ValidationAttributeAdapterProvider();
public IAttributeAdapter GetAttributeAdapter(CPFAttribute attribute, IStringLocalizer stringLocalizer)
{
if (attribute is CPFAttribute)
return new CPFAttributeAdapter(attribute as CPFAttribute, stringLocalizer);
else
return _baseProvider.GetAttributeAdapter(attribute, stringLocalizer);
}
public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
{
if (attribute is CPFAttribute) return
new CPFAttributeAdapter(attribute as CPFAttribute,
stringLocalizer);
else return _baseProvider.GetAttributeAdapter(attribute, stringLocalizer);
}
}
并在 Startup.cs 中写下:
services.AddSingleton<IValidationAttributeAdapterProvider, CPFAttributeAdapterProvider>();
推荐阅读
- javascript - 如何将区分大小写的 object.property 从 vba 传递给 Javascript?
- r - hdm 包中的 rlassoEffects 语法不起作用?
- laravel - 如何使用 laravel 在数据库表中提交多个条目?
- node.js - 如何在会话中设置使用 AdonisJs 在外部 API 下进行身份验证的用户?
- python - 带有包含 NaN 的轴的 Seaborn 条形图
- python - Python 无法识别数字
- css - 为什么 `overflow-x: auto;` 在 `flex-direction: row;` 祖先中表现异常?
- react-native - 反应原生,
在不止一行 - tensorflow - 在没有 infiniband 设备的情况下使用带有 VERBS 支持的 tensorflow
- javascript - 在 Summernote 中的后退按钮上获取文本