Asp.net
如何自定義 Asp.net Identity 2 使用者名已採取驗證消息?
如何自定義 Asp.net Identity 2 使用者名已採用驗證消息(名稱 XYZ 已採用。)?謝謝
好吧,我沒有找到任何簡單的解決方案來解決這個問題。簡單地說,我的意思是修改屬性/模型/控制器中的一些消息。
一種可能的解決方案可能是:
執行後
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, @"^[A-Za-z0-9@_\.]+$")) { // 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)); } } }您可以看到所有正在使用的驗證錯誤消息資源,因此通過在資源中指定自定義格式,您將能夠自定義這些消息。
ApplicationUserManager您可以在類中註冊您的驗證器,Create方法:public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { manager.UserValidator = new CustomUserValidator<ApplicationUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; }