web-dev-qa-db-ja.com

ASP.NETCoreカスタム検証属性のローカリゼーション

Asp.netコア1.0のカスタム検証属性にローカリゼーションを実装しようとしています。これは私の簡略化されたビューモデルです:

public class EditPasswordViewModel
{
    [Required(ErrorMessage = "OldPasswordRequired")]
    [DataType(DataType.Password)]
    [CheckOldPassword(ErrorMessage = "OldPasswordWrong")]
    public string OldPassword { get; set; }
}

「OldPasswordRequired」のローカリゼーションは正常に機能しています。ただし、カスタム属性のローカリゼーションが機能せず、常に「OldPasswordWrong」メッセージが返されます。これはコードです:

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はありません)。

13
rickyalbert

ローカリゼーション用のアダプターを実装します。

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

アダプターのプロバイダーを実装します。

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にプロバイダーを登録します。

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();

このブログのクレジット: https://blogs.msdn.Microsoft.com/mvpawardprogram/2017/01/03/asp-net-core-mvc/

10
Ramin

文化を指定する必要があります。 formaterrormesageは何をしますか?それは文化を処理しますか?

このリンクを確認してください

0