用户名而不是EmailView for RegisterViewModel MVC5

时间:2015-09-23 23:58:02

标签: asp.net asp.net-mvc visual-studio

我想更改电子邮件字段并更改用户名...所以我删除默认验证并在我的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]验证,为什么我仍然得到这个验证?

enter image description here

1 个答案:

答案 0 :(得分:1)

我在这里假设您使用的是默认的UserValidator。

用户的验证由专门的班级执行。 Miscrosoft的MVC5示例为这些验证提供了默认实现,但是可以覆盖它们。

要执行此操作,请检查Create课程中的ApplicationUserManager方法。

你应该有像

这样的东西
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)

默认情况下,此实现允许您稍微自定义用户验证的某些方面,例如RequireUniqueEmailAllowOnlyAlphanumericUserNames。但是,您想要的是首先完全消除对电子邮件的需求。

您需要的是两件事:

  1. 实施新验证器
  2. 注册您的新验证器以供您的应用程序使用。
  3. 实施新的验​​证器

    您需要创建一个继承自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 };