Home > DeveloperSection > Forums > ASP.NET MVC 5 Validation - Property are different
Goti Bandu

Total Post:119

Points:835
Posted on    December-26-2014 5:59 AM

 .NET Mvc5  Validation 
Ratings:


 1 Reply(s)
 690  View(s)
Rate this:

Hi I thought this was a simple one.

To reduce the problem for the sake of clarity I have a three properties in my view model, user name, password and confirm password.

Obviously we want to make sure the passwords match but I also want to make sure that they do not match the username.

There are lots of hacks out there for previous version of MVC but I can't believe there is not a more subtle way of dealing with this obvious comparison in MVC5

[Required]

    [DataType(DataType.Text)]

    [Display(Name = "User name")]

    public string UserName { get; set; }

 

    [Required]

    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]

    [DataType(DataType.Password)]

    [Display(Name = "Password")]

    [NotEqualTo("UserName", ErrorMessage = "The password can not be the same as the User name.")]

    public string Password { get; set; }

 

    [Required]

    [DataType(DataType.Password)]

    [Display(Name = "Confirm password")]

    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]

    public string ConfirmPassword { get; set; }



Manoj Bhatt
Manoj Bhatt

Total Post:153

Points:1079
Posted on    December-26-2014 7:10 AM

I'm a big fan of using the FluentValidation library when dealing with any non-standard validations. It even contains a NotEqual() method for doing exactly what you're talking about.

public class RegisterViewModelValidator: AbstractValidator<RegisterViewModel> 

{

    public RegisterViewModelValidator()

    {

        RuleFor(m => m.Password).NotEqual(m => m.UserName).WithMessage("Password Cannot Match Username");

    }

}

You may want to go a step further and change it not allow the password to CONTAIN the username.

RuleFor(m => m.Password).Must((vm, pwd) => !pwd.Contains(vm.UserName)).WithMessage("Password Cannot Match Username");

While you can mix FluentValidation and the standard attributes as well, MVC will get mad if they both apply the same validation (for example, including the [Required] attribute and also adding the NotEmpty() rule in Fluent will throw an error).


Don't want to miss updates? Please click the below button!

Follow MindStick