如果密码不是空的,如何验证密码是否符合长度要求?

时间:2014-01-16 09:39:59

标签: c# regex asp.net-mvc

我正在创建一个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是我唯一的选择吗?

2 个答案:

答案 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}))$这是任何密码 - 因为任何字符串都以空字符串开头。