问题描述
我正在尝试在 asp.net core 1.0 的自定义验证属性中实现本地化.这是我的简化视图模型:
I'm trying to implement localization in a custom validation attribute in asp.net core 1.0. This is my simplified viewmodel:
public class EditPasswordViewModel
{
[Required(ErrorMessage = "OldPasswordRequired")]
[DataType(DataType.Password)]
[CheckOldPassword(ErrorMessage = "OldPasswordWrong")]
public string OldPassword { get; set; }
}
OldPasswordRequired"的本地化工作正常.但是,我的自定义属性的本地化不起作用,并且总是返回OldPasswordWrong"消息.这是代码:
The localization of "OldPasswordRequired" is working fine. However the localization of my custom attribute is not working and returns always "OldPasswordWrong" message. This is the code:
public class CheckOldPasswordAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object classInstance, ValidationContext validationContext)
{
if (oldPasswordSaved == oldPasswordTyped) //simplified
{
return ValidationResult.Success;
}
else
{
string errorMessage = FormatErrorMessage(ErrorMessageString);
return new ValidationResult(errorMessage);
}
}
}
ErrorMessageString 始终为OldPasswordWrong",而 FormatErrorMessage 始终返回OldPasswordWrong".我究竟做错了什么?我正在使用新的 asp.net 核心数据注释本地化,所以我没有使用 ErrorMessageResourceName 和 ErrorMessageResourceType 属性(我没有任何 ViewModel.Designer.cs).
ErrorMessageString is always "OldPasswordWrong" and FormatErrorMessage returns always "OldPasswordWrong". What am I doing wrong?I'm using the new asp.net core data annotations localizations, so I'm not using ErrorMessageResourceName and ErrorMessageResourceType attributes (I don't have any ViewModel.Designer.cs).
推荐答案
实现一个本地化适配器:
Implement an adapter for localization:
public class RequiredIfAttributeAdapter : AttributeAdapterBase<RequiredIfAttribute>
{
public RequiredIfAttributeAdapter(RequiredIfAttribute attribute, IStringLocalizer stringLocalizer) : base(attribute, stringLocalizer) {}
public override void AddValidation(ClientModelValidationContext context) {}
public override string GetErrorMessage(ModelValidationContextBase validationContext)
{
return GetErrorMessage(validationContext.ModelMetadata, validationContext.ModelMetadata.GetDisplayName());
}
}
为适配器实现提供程序:
Implement a provider for the adapter(s):
public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
private readonly IValidationAttributeAdapterProvider _baseProvider = new ValidationAttributeAdapterProvider();
public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
{
if (attribute is RequiredIfAttribute)
return new RequiredIfAttributeAdapter(attribute as RequiredIfAttribute, stringLocalizer);
else
return _baseProvider.GetAttributeAdapter(attribute, stringLocalizer);
}
}
在 Startup.cs 中注册提供程序:
Register the provider in Startup.cs:
services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();
此博客的致谢:https://blogs.msdn.microsoft.com/mvpawardprogram/2017/01/03/asp-net-core-mvc/
这篇关于ASP.NET Core 自定义验证属性本地化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!