2017-03-14 37 views
5

Próbuję zaimplementować lokalizację w niestandardowym atrybucie sprawdzania poprawności w asp.net core 1.0. To jest mój uproszczony ViewModel:Lokalizacja niestandardowego atrybutu sprawdzania ASP.NET Core

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

Lokalizację "OldPasswordRequired" działa dobrze. Jednak lokalizacja mojego niestandardowego atrybutu nie działa i zawsze zwraca komunikat "OldPasswordWrong". Jest to kod:

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 jest zawsze "OldPasswordWrong" i FormatErrorMessage powraca zawsze "OldPasswordWrong". Co ja robię źle? Używam nowych lokalizacji adnotacji danych podstawowych asp.net, więc nie używam atrybutów ErrorMessageResourceName i ErrorMessageResourceType (nie mam żadnych ViewModel.Designer.cs).

Dziękuję bardzo

Odpowiedz

7

Wdrożenie adaptera do lokalizacji:

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

wdrożyć dostawcy dla adaptera (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); 
    } 
} 

zarejestrować dostawcę w Startup.cs:

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>(); 

Kredyty na ten blog: https://blogs.msdn.microsoft.com/mvpawardprogram/2017/01/03/asp-net-core-mvc/

+0

Dzięki, uratowałeś mój dzień! Miałem nadzieję, że nie muszę napisać tak dużo "kodu kleju" chociaż ... – rickyalbert

0

musisz określić kulturę. Co zrobi formaterrormesage? Czy poradzi sobie z kulturą?

Check this link

+0

ErrorMessageString powinien już być zlokalizowaną wartością. Zobacz dokumentację https://msdn.microsoft.com/it-it/library/system.componentmodel.dataannotations.validationattribute.errormessagestring(vsvs.110).aspx. – rickyalbert