2017-03-14 19 views
5

Tôi đang cố gắng triển khai bản địa hóa trong thuộc tính xác thực tùy chỉnh trong lõi asp.net 1.0. Đây là chế độ xem đơn giản của tôi:Bản địa hóa thuộc tính xác thực tùy chỉnh ASP.NET Core

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

Việc bản địa hóa "OldPasswordRequired" đang hoạt động tốt. Tuy nhiên, việc bản địa hóa thuộc tính tùy chỉnh của tôi không hoạt động và trả về luôn thông báo "OldPasswordWrong". Đây là mã:

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 luôn luôn là "OldPasswordWrong" và FormatErrorMessage luôn trả về "OldPasswordWrong". Tôi đang làm gì sai? Tôi đang sử dụng các thuộc tính chú thích dữ liệu cốt lõi asp.net mới, vì vậy tôi không sử dụng các thuộc tính ErrorMessageResourceName và ErrorMessageResourceType (tôi không có bất kỳ ViewModel.Designer.cs) nào.

Cảm ơn bạn rất nhiều

Trả lời

7

Thực hiện một adapter cho nội địa hóa:

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

Thực hiện một nhà cung cấp cho các bộ chuyển đổi (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); 
    } 
} 

Đăng ký nhà cung cấp trong Startup.cs:

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>(); 

Các khoản tín dụng cho blog này: https://blogs.msdn.microsoft.com/mvpawardprogram/2017/01/03/asp-net-core-mvc/

+0

Cảm ơn, bạn đã cứu ngày của tôi! Tôi đã hy vọng tôi không phải viết quá nhiều 'mã keo' mặc dù .. – rickyalbert

0

Bạn cần chỉ định văn hóa. Những gì hiện formaterrormesage sẽ làm gì? Nó sẽ xử lý văn hóa?

Check this link

+0

ErrorMessageString phải là giá trị được bản địa hoá. Xem tài liệu https://msdn.microsoft.com/it-it/library/system.componentmodel.dataannotations.validationattribute.errormessagestring(v=vs.110).aspx. – rickyalbert

Các vấn đề liên quan