C# 如何验证密码是否满足长度要求(仅当密码不是';你没有空吗?

C# 如何验证密码是否满足长度要求(仅当密码不是';你没有空吗?,c#,regex,asp.net-mvc,C#,Regex,Asp.net Mvc,我正在制作一个ASP.NET MVC应用程序,其中用户需要能够更改其密码 在EditUser页面中,我需要验证密码是否与某个正则表达式匹配并具有给定的长度,当密码不够长且包含禁止字符时,我需要显示不同的消息 此外,如果用户未触及该字段,我也不能更改密码 my ViewModel中的密码成员如下所示: //[StringLength(40, ErrorMessage = "Password between 3 and 40 characters", MinimumLength = 3)] [Dat

我正在制作一个ASP.NET MVC应用程序,其中用户需要能够更改其密码

在EditUser页面中,我需要验证密码是否与某个正则表达式匹配并具有给定的长度,当密码不够长且包含禁止字符时,我需要显示不同的消息

此外,如果用户未触及该字段,我也不能更改密码

my 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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 
我尝试使用两个正则表达式,希望它能验证第一个,如果成功,验证第二个,但不能重复该属性:

[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是我唯一的选择吗?

像这样的东西应该可以完成这项工作:

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);
    }
}
然后你可以这样使用它:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

像这样的东西应该可以完成这项工作:

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);
    }
}
然后你可以这样使用它:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

像这样的东西应该可以完成这项工作:

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);
    }
}
然后你可以这样使用它:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

像这样的东西应该可以完成这项工作:

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);
    }
}
然后你可以这样使用它:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

我认为您的正则表达式缺少括号。 应该是这样的:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

您编写它的方式将匹配任何密码的
^()
([a-zA-Z0-9]{3,40}))$
,因为任何字符串都以空字符串开头。

我认为您的正则表达式缺少括号。 应该是这样的:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

您编写它的方式将匹配任何密码的
^()
([a-zA-Z0-9]{3,40}))$
,因为任何字符串都以空字符串开头。

我认为您的正则表达式缺少括号。 应该是这样的:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 

您编写它的方式将匹配任何密码的
^()
([a-zA-Z0-9]{3,40}))$
,因为任何字符串都以空字符串开头。

我认为您的正则表达式缺少括号。 应该是这样的:

//[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; }
    [OptionalPassword]
    public string Password { get; set; }
^(()|([a-zA-Z0-9]{3,40}))$ 


您编写它的方式将匹配任何密码的
^()
([a-zA-Z0-9]{3,40}))$
,因为任何字符串都以空字符串开头。

您的文章标题有些混乱。。。如果密码是空的,怎么可能是“长”密码呢;我已经编辑了标题。谢谢。你的帖子标题有点混乱。。。如果密码是空的,怎么可能是“长”密码呢;我已经编辑了标题。谢谢。你的帖子标题有点混乱。。。如果密码是空的,怎么可能是“长”密码呢;我已经编辑了标题。谢谢。你的帖子标题有点混乱。。。如果密码是空的,怎么可能是“长”密码呢;我已经编辑了标题。谢谢。谢谢你的意见;它与我试图编写的自定义验证器没有太大区别,以防找不到更好的替代方案。但是代码中有一些错误:IsValid应该返回一个ValidationResult,这一次,我会纠正自己:IsValid在其签名包含上下文参数时返回一个ValidationResult。public override bool IsValid(对象值)可以。谢谢,现在更改了我的答案-这将教会我不要测试:)谢谢你的输入;它与我试图编写的自定义验证器没有太大区别,以防找不到更好的替代方案。但是代码中有一些错误:IsValid应该返回一个ValidationResult,这一次,我会纠正自己:IsValid在其签名包含上下文参数时返回一个ValidationResult。public override bool IsValid(对象值)可以。谢谢,现在更改了我的答案-这将教会我不要测试:)谢谢你的输入;它与我试图编写的自定义验证器没有太大区别,以防找不到更好的替代方案。但是代码中有一些错误:IsValid应该返回一个ValidationResult,这一次,我会纠正自己:IsValid在其签名包含上下文参数时返回一个ValidationResult。public override bool IsValid(对象值)可以。谢谢,现在更改了我的答案-这将教会我不要测试:)谢谢你的输入;它与我试图编写的自定义验证器没有太大区别,以防找不到更好的替代方案。但是代码中有一些错误:IsValid应该返回一个ValidationResult,这一次,我会纠正自己:IsValid在其签名包含上下文参数时返回一个ValidationResult。public override bool IsValid(对象值)可以。谢谢,现在更改了我的答案-这将教会我不要测试:)