20

Asp.net Identity 2 kullanıcı adı önceden alınmış doğrulama mesajını nasıl özelleştirebilirim (Name XYZ önceden alınmış durumdadır)? TeşekkürlerAsp.net Identity 2 kullanıcı adı önceden alınmış doğrulama mesajını nasıl özelleştirebilirim?

+1

Ben incelerim k Kimlik modeline bir göz atmanız ve bunun için herhangi bir özel özellik olup olmadığını öğrenmeniz gerekir. Veya hesap denetleyicisine – qamar

+4

@qamar bakın. Bu özel durumda, tüm mesajlar Kimlik kaynaklarına gömülü olduğu için yanılıyorsunuz. –

cevap

19

Bu soruna herhangi bir basit çözüm bulamadım. Ve basit olarak bir öznitelik/model/denetleyicideki bazı iletileri değiştirmeyi kastediyorum.

olası bir çözüm olabilir:

bunu için Hatalar mülkü kontrol edebilirsiniz başarılı olmadığı sonucu durumda

var result = await UserManager.CreateAsync(user, model.Password); 

çalıştırıldıktan sonra "önceden alınmış Adı XYZ." desen ve özel mesaj ile değiştirin.

Başka bir çözüm (bu benim tercih edilen yoldur) özel UserValidation sınıf yazmaktır

: bir özel biçimi belirleyerek Yani, kullanılan tüm doğrulama hata iletileri Kaynaklar görebilirsiniz

/// <summary> 
    ///  Validates users before they are saved to an IUserStore 
    /// </summary> 
    /// <typeparam name="TUser"></typeparam> 
    public class CustomUserValidator<TUser> : UserValidator<TUser, string> 
     where TUser : ApplicationUser 
    { 
     /// <summary> 
     ///  Constructor 
     /// </summary> 
     /// <param name="manager"></param> 
     public CustomUserValidator(UserManager<TUser, string> manager) : base(manager) 
     { 
      this.Manager = manager; 
     } 

     private UserManager<TUser, string> Manager { get; set; } 

     /// <summary> 
     ///  Validates a user before saving 
     /// </summary> 
     /// <param name="item"></param> 
     /// <returns></returns> 
     public override async Task<IdentityResult> ValidateAsync(TUser item) 
     { 
      if (item == null) 
      { 
       throw new ArgumentNullException("item"); 
      } 
      var errors = new List<string>(); 
      await ValidateUserName(item, errors); 
      if (RequireUniqueEmail) 
      { 
       await ValidateEmail(item, errors); 
      } 
      if (errors.Count > 0) 
      { 
       return IdentityResult.Failed(errors.ToArray()); 
      } 
      return IdentityResult.Success; 
     } 

     private async Task ValidateUserName(TUser user, List<string> errors) 
     { 
      if (string.IsNullOrWhiteSpace(user.UserName)) 
      { 
       errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.PropertyTooShort, "Name")); 
      } 
      else if (AllowOnlyAlphanumericUserNames && !Regex.IsMatch(user.UserName, @"^[[email protected]_\.]+$")) 
      { 
       // If any characters are not letters or digits, its an illegal user name 
       errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.InvalidUserName, user.UserName)); 
      } 
      else 
      { 
       var owner = await Manager.FindByNameAsync(user.UserName); 
       if (owner != null && !EqualityComparer<string>.Default.Equals(owner.Id, user.Id)) 
       { 
        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, user.UserName)); 
       } 
      } 
     } 

     // make sure email is not empty, valid, and unique 
     private async Task ValidateEmail(TUser user, List<string> errors) 
     { 
      if (!user.Email.IsNullOrWhiteSpace()) 
      { 
       if (string.IsNullOrWhiteSpace(user.Email)) 
       { 
        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.PropertyTooShort, "Email")); 
       return; 
       } 
       try 
       { 
        var m = new MailAddress(user.Email); 
       } 
       catch (FormatException) 
       { 
        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.InvalidEmail, email)); 
       return; 
       } 
      } 
      var owner = await Manager.FindByEmailAsync(user.Email); 
      if (owner != null && !EqualityComparer<string>.Default.Equals(owner.Id, user.Id)) 
      { 
       errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateEmail, email)); 
      } 
     } 
    } 

senin Bu mesajları özelleştirebileceğiniz kaynaklar.

public class AppUser:IdentityUser 
    { 
    public string MyUserName{get; set;} 
    } 
+20

Bir dizgeyi değiştirmek için kendi doğrulayıcıyı uygulamanızın gerekliliği inanılmaz. –

+0

Ve hatalar, yeni bir 'IdentityResult 'oluşturmadan bile hatalarını nasıl değiştirebileceğimi bile göremiyorum, çünkü' Hatalar 'salt okunur IEnumerable'tır. – im1dermike

+0

Bunu denediğimde, '' Kaynaklar '' koruma seviyesi nedeniyle erişilemez '' hatasını alıyorum. Microsoft.AspNet.Identity.Resources sınıfını kontrol edersem dahili olarak işaretlenir. – Ogglas

0

kolay yolu:

Sen Create yöntem ApplicationUserManager sınıfta doğrulayıcı kayıt olabilirsiniz :

private void AddErrors(IdentityResult result) 
{ 
    foreach (var error in result.Errors) 
    { 
     if (error.StartsWith("Name")) 
     { 
      var NameToEmail= Regex.Replace(error,"Name","Email"); 
      ModelState.AddModelError("", NameToEmail); 
     } 
     else 
     { 
      ModelState.AddModelError("", error); 
     } 
    } 
} 
1

Sadece bu gibi AddErrors yöntemi özelleştirmek: gibi ApplicationUser sınıfa kendi mülkü eklemek

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
{ 
    manager.UserValidator = new CustomUserValidator<ApplicationUser>(manager) 
    { 
     AllowOnlyAlphanumericUserNames = false, 
     RequireUniqueEmail = true 
    }; 
}