在数据注释错误信息中访问PasswordValidator

问题描述:

如何从viewmodel访问PasswordValidator属性来装饰输入密码验证?在数据注释错误信息中访问PasswordValidator

例如,这是在IdentityConfig.cs /创建

 // Configure validation logic for passwords 
     manager.PasswordValidator = new PasswordValidator 
     { 
      RequiredLength = 7, 
      RequireNonLetterOrDigit = false, 
      RequireDigit = true, 
      RequireLowercase = false, 
      RequireUppercase = false, 
     }; 
在AccountViewModels.cs

然后

public class RegisterViewModel 
{ 
    [Required] 
    [EmailAddress] 
    [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; } 
} 

属性[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 7)]防止被提交,直到输入的密码的形式是正确的长度。如果我删除它,表单可以发布,但由于PassordValidator会产生错误,所以我认为最好拥有该属性,以便在正确之前不会发布任何内容。

如何访问RegisterViewModel中的PasswordValidator属性?

例如像

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = passwordValidator.RequiredLength)] 
+0

添加一个'[RegularExpression]'属性,该属性将所有要求考虑在内 –

有可能是一个更好的办法,但考虑到你想要分享的passwordvalidator和视图模型之间的配置,并保持同步,你可以使用应用程序设置外化配置,其将允许你保持两个类的分离。

所以,你可以(如果使用.NET的核心或appsettings.json)

例如appsetting添加到您的web.config(pseudoish代码,而不是检查它编译但给出了这个概念)

网络。配置:

<appSettings> 
    <add key="passwordminlength" value="6" /> 
... 
</appSettings> 

属性:

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = (int) ConfigurationManager.AppSettings["passwordminlength")] 

验证:

manager.PasswordValidator = new PasswordValidator 
{ 
    RequiredLength = (int) ConfigurationManager.AppSettings["passwordminlength") 
    ... 
}