20

Come posso personalizzare il nome utente di Asp.net Identity 2 già preso il messaggio di convalida (Nome XYZ è già occupato)? GrazieCome personalizzare il nome utente di Asp.net Identity 2 già preso il messaggio di convalida?

+1

I thin k devi dare un'occhiata al modello di identità e capire se c'è qualche attributo speciale per quello. Oppure guarda il controller account – qamar

+4

@qamar. In questo caso specifico si sbaglia perché tutti i messaggi sono incorporati nelle risorse Identity –

risposta

19

Bene, non ho trovato alcuna soluzione semplice a questo problema. E per semplice intendo modificare un messaggio in un attributo/modello/controllore.

Una possibile soluzione potrebbe essere:

Dopo l'esecuzione

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

Nel caso in cui il risultato non è successo si può verificare è Errori proprietà per la "è già preso Nome XYZ". pattern e sostituirlo con il tuo messaggio personalizzato.

Un'altra soluzione (questo è il mio modo preferito) è quello di scrivere una classe personalizzata UserValidation:

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

Si può vedere che per tutte le Risorse messaggi di errore di validazione in uso, quindi specificando un formato personalizzato nella vostra risorse sarete in grado di personalizzare tali messaggi.

È possibile registrare il validatore in ApplicationUserManager classe, Create metodo:

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

È incredibile che sia necessario implementare il proprio validatore per modificare una stringa. –

+0

E non vedo nemmeno come sia possibile sostituire il messaggio di errore senza creare un nuovo 'IdentityResult' dato che' Errors' è un oggetto IEnumerable di sola lettura. – im1dermike

+0

Quando provo questo ho l'errore "Risorse" inaccessibile a causa del suo livello di protezione ". Se controllo la classe Microsoft.AspNet.Identity.Resources è contrassegnata come interna. – Ogglas

0

Il modo più semplice per aggiungere la vostra proprietà per ApplicationUser classe come:

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

Basta personalizzare il tuo metodo di AddErrors come questo :

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); 
     } 
    } 
} 
Problemi correlati