gpt4 book ai didi

c# - 如何从 "ErrorMessage"翻译 "Custom Attribute"

转载 作者:行者123 更新时间:2023-12-05 02:12:43 28 4
gpt4 key购买 nike

我创建了一个自定义验证属性,它只验证一个CPF属性是否是一个有效的CPF,但是当我本地化应用程序时,我注意到我的自定义属性没有将其消息由框架本地化,这与数据属性 Required 不同,它的消息已正确定位:

正确本地化 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
}
}

Versions:

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());
}
}

并实现属性适配器提供程序:

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>();

关于c# - 如何从 "ErrorMessage"翻译 "Custom Attribute",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55553314/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com