20

मैं एएसपीनेट पहचान 2 उपयोगकर्ता नाम पहले से ही सत्यापन संदेश कैसे अनुकूलित कर सकता हूं (नाम XYZ पहले ही लिया जा चुका है।)? धन्यवादएएसपीनेट पहचान 2 उपयोगकर्ता नाम पहले से ही सत्यापन संदेश कैसे अनुकूलित कर सकते हैं?

+1

मैं पतला के लिए आपको पहचान मॉडल पर एक नज़र डालने की आवश्यकता है और इसके लिए कोई विशेष विशेषता है या नहीं। या खाता नियंत्रक – qamar

+4

@qamar देखें। इस विशेष मामले में आप गलत हैं क्योंकि सभी संदेश पहचान संसाधनों में एम्बेड किए गए हैं –

उत्तर

19

अच्छा, मुझे इस मुद्दे का कोई आसान समाधान नहीं मिला। और सरल से मेरा मतलब है एक विशेषता/मॉडल/नियंत्रक में कुछ संदेश संशोधित करना।

एक संभव समाधान हो सकता है:

को क्रियान्वित करने

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

मामले में है कि परिणाम आप जाँच कर सकते हैं इसके लिए त्रुटियाँ संपत्ति है सफल नहीं होता है के बाद "नाम XYZ पहले से ही लिया जाता है।" पैटर्न और इसे अपने कस्टम संदेश से प्रतिस्थापित करें।

एक अन्य समाधान (यह मेरा पसंदीदा तरीका है) एक कस्टम 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)); 
      } 
     } 
    } 

आप देख सकते हैं कि सभी मान्यता त्रुटि संदेश संसाधन के लिए अपने संसाधन आप उन संदेशों को कस्टमाइज़ करने में सक्षम होंगे।

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

यह अविश्वसनीय है कि आपको स्ट्रिंग बदलने के लिए अपने स्वयं के सत्यापनकर्ता को लागू करने की आवश्यकता है। –

+0

और मैं यह भी नहीं देखता कि 'त्रुटि' के बिना त्रुटि संदेश को प्रतिस्थापित कैसे किया जा सकता है क्योंकि 'त्रुटियां' केवल पढ़ने योग्य आईन्यूमेबल है। – im1dermike

+0

यह कोशिश करते समय मुझे त्रुटि मिलती है 'संसाधन' इसके सुरक्षा स्तर के कारण पहुंच योग्य नहीं है। यदि मैं क्लास Microsoft.AspNet.Identity क्लास की जांच करता हूं। स्रोतों को इसे आंतरिक के रूप में चिह्नित किया जाता है। – Ogglas

0

आसान तरीका ApplicationUser वर्ग की तरह करने के लिए अपनी खुद की संपत्ति जोड़ने के लिए:

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

बस इस तरह अपने AddErrors विधि अनुकूलित

आप अपने सत्यापनकर्ता ApplicationUserManager कक्षा में, रजिस्टर कर सकते हैं Create विधि :

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); 
     } 
    } 
} 
संबंधित मुद्दे