2017-08-14 82 views
0

如何從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]'屬性,該屬性將所有要求考慮在內 –

回答

1

有可能是一個更好的辦法,但考慮到你想要分享的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") 
    ... 
}