我正在创建一个ASP.NET MVC应用程序,用户需要能够更改他/她的密码。
在EditUser页面中,我需要验证密码是否与某个正则表达式匹配并且具有给定长度,并且当密码不够长并且包含禁止字符时,我需要显示不同的消息。
此外,如果用户不接触该字段,我不得更改密码。
我的ViewModel中的密码成员如下所示:
//[StringLength(40, ErrorMessage = "Password between 3 and 40 characters", MinimumLength = 3)]
[DataType(DataType.Password)]
[ValidatePasswordLengthAttribute]
[RegularExpression(@"^()|([a-zA-Z0-9]{3,40})$", ErrorMessage = "Error en el formato de la contraseña.")]
public string Password { get; set; }
我尝试使用两个正则表达式,希望它能验证第一个正则表达式,如果成功,则第二个正则表达式,但你不能重复该属性:
[RegularExpression(@"^()|(.{3,40})$", ErrorMessage = "Password entre 3 y 40 caracteres")]
[RegularExpression(@"^()|([a-zA-Z0-9]{3,40})$", ErrorMessage = "Error en el formato de la contraseña.")]
当然我不能使用StringLength,因为它永远不会接受留空的字段:
[StringLength(40, ErrorMessage = "Password between 3 and 40 characters", MinimumLength = 3)]
解决这个问题最简单的方法是什么? CustomValidator是我唯一的选择吗?
答案 0 :(得分:2)
这样的事情应该可以胜任:
public class OptionalPassword : ValidationAttribute
{
private static Regex passwordPattern =
new Regex(@"^()|([a-zA-Z0-9]{3,40})$",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
public override ValidationResult IsValid(object value, ValidationContext context)
{
var password = value as string;
if (string.IsNullOrEmpty(password)) {
return true;
}
return passwordPattern.IsMatch(password);
}
}
然后你可以像这样使用它:
[OptionalPassword]
public string Password { get; set; }
答案 1 :(得分:1)
我认为你的正则表达式周围没有括号。 它应该是这样的:
^(()|([a-zA-Z0-9]{3,40}))$
您编写它的方式将匹配^()
或([a-zA-Z0-9]{3,40}))$
这是任何密码 - 因为任何字符串都以空字符串开头。