我想更改电子邮件字段并更改用户名...所以我删除默认验证并在我的RegisterViewModel中创建新字段UserName
public class RegisterViewModel
{
[Required]
public string UserName { get; set; }
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
进入AccountController:我改变了那样的电子邮件比较:
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.UserName, Email = model.UserName};
var result = await UserManager.CreateAsync(user, model.Password);
最后在我看来:
<div class="form-group">
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
</div>
</div>
因此,当我尝试创建用户向我发送验证时,我得到了这个:电子邮件'用户名'无效。
但是我从RegisterViewModel中删除了[EmailAdress]
验证,为什么我仍然得到这个验证?
答案 0 :(得分:1)
我在这里假设您使用的是默认的UserValidator。
用户的验证由专门的班级执行。 Miscrosoft的MVC5示例为这些验证提供了默认实现,但是可以覆盖它们。
要执行此操作,请检查Create
课程中的ApplicationUserManager
方法。
你应该有像
这样的东西// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
默认情况下,此实现允许您稍微自定义用户验证的某些方面,例如RequireUniqueEmail
或AllowOnlyAlphanumericUserNames
。但是,您想要的是首先完全消除对电子邮件的需求。
您需要的是两件事:
您需要创建一个继承自UserValidator<ApplicationUser>
的新类(ApplicationUser
是您的应用程序用来描述要验证的用户的类。)
然后,您可以覆盖ValidateAsync
方法以反映您要执行的验证。这里一个便宜的方法是让基类完成所有工作并添加/删除您想要忽略的验证。虽然它不一定优雅,但它将完成工作并将说明目的。如果你发现它不够优雅,你可以自由地实现你想要的自定义验证逻辑。
var result = await base.ValidateAsync(item);
if (result.Succeeded)
{
return result;
}
return new IdentityResult(result.Errors.Where(s => s != string.Format("Email '{0}' is invalid.", item.UserName)));
最后,您需要自己替换当前的UserValidator
。
在ApplicationUserManager.Create
中,通过以下方式分配给manager.UserValidator
:
manager.UserValidator = new MyCustomUserValidator<ApplicationUser>(manager)
{
RequireUniqueEmail = false
};
Voilà,应该这样做。
编辑:您可能想要做的一件事是删除电子邮件属性的分配,因为它将不再有任何意义:
var user = new ApplicationUser { UserName = model.UserName, Email = model.UserName};
会变成
var user = new ApplicationUser { UserName = model.UserName };