Проверить длину пароля с помощью атрибута, который также принимает пустой?

Я хотел бы проверить длину пароля при редактировании, если пароль введен, в противном случае следует считать пустым все в порядке.

Я видел предложения пропустить атрибут для пароля в модели редактирования и выполнить проверку в коде, но я хочу использовать атрибуты для всей проверки.

Кажется, что-то подобное уже должно быть в библиотеке. Я просто пропустил это?
Я использую EntLib 5 VAB и MVC 2 на AspNet 3.5.

Ваниль редактировать модель:

[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirmation password do not match.")]
public class EditAccountModel
{
    public Guid ProviderUserKey { get; set; }

    [Required]
    [DisplayName("User name")]
    public string UserName { get; set; }

    [Required]
    [Email(ErrorMessage = "Not a valid email")]
    [DataType(DataType.EmailAddress)]
    [DisplayName("Email address")]
    public string Email { get; set; }

    //[ValidatePasswordLength] <- Requires password
    [DataType(DataType.Password)]
    [DisplayName("Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [DisplayName("Confirm password")]
    public string ConfirmPassword { get; set; }
}

3 ответа

Решение

ValidatePasswordLengthAttribute не является частью ядра MVC, но создается в вашем проекте из шаблона проекта MVC по умолчанию в AccountModels.cs. Вы можете свободно изменять его реализацию. Изменить IsValid способ принять null и пустая строка в качестве допустимых значений.

public override bool IsValid(object value) {
    string valueAsString = value as string;
    return String.IsNullOrEmpty(valueAsString) || valueAsString.Length >= _minCharacters);
}

Это работает с MVC4 и jQuery 1.8.

Требование: минимум 9 символов, 1 специальный символ, 1 цифра и 1 заглавная буква в пароле.

[DisplayName("Password")]
[RegularExpression(@"^.*(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*\(\)_\-+=]).*$", ErrorMessage = "User_Password_Expression")]
[StringLength(20, MinimumLength = 9,  ErrorMessage = "length err")]
[DataType(DataType.Password)]
public override sealed string Password { get; set; }

Вы можете создать новый пользовательский атрибут проверки.

Public Class MyCustomValidation : RegularExpressionAttribute
{
   public MyCustomValidation() : base([Your regular expression])
   {} 
}

И измените ваш код, как показано ниже:

[MyCustomValidation(ErrorMessage = "")]
[DataType(DataType.Password)]
[DisplayName("Password")]
public string Password { get; set; }
Другие вопросы по тегам