2014-12-12 3 views
1

안녕하세요, 저는 이것이 단순한 것이라고 생각했습니다.ASP.NET MVC 5 유효성 검사 - 속성이 다릅니다

명확성을 위해 문제를 줄이기 위해 뷰 모델, 사용자 이름, 암호 및 암호 확인에 세 가지 속성이 있습니다.

확실히 우리는 암호가 일치하는지 확인하려고하지만 사용자 이름과 일치하지 않는지 확인하려고합니다.

이 해킹의 많은 MVC의 이전 버전 거기 밖으로하지만 난 큰 팬이에요 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; } 
+0

그래서 무엇이 문제입니까? 이 속성을 구현하고 하루 종일 걸리지 않아야합니다. –

+0

예를 들어 RemoteValidation을 확인할 수도 있습니다. http://stackoverflow.com/questions/10163683/remote-validation-mvc-3-0-multiple- fields-validation –

+0

Vsevolod는 문제였습니다. 더 미묘한 방법으로 해결할 수 있습니까? – JasonLCook

답변

3

이 분명 비교 다루는 더 미묘한 방법이없는 믿을 수 없어 비표준 유효성 검사를 처리 할 때 FluentValidation 라이브러리 사용 그것은 당신이 말하는 것을 정확히 수행하기위한 NotEqual() 메서드를 포함합니다.

public class RegisterViewModelValidator: AbstractValidator<RegisterViewModel> 
{ 
    public RegisterViewModelValidator() 
    { 
     RuleFor(m => m.Password).NotEqual(m => m.UserName).WithMessage("Password Cannot Match Username"); 
    } 
} 

추가 단계로 가서 암호가 사용자 이름을 포함하지 않도록 변경하십시오.

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

당신이 FluentValidation을 혼합 할 수 표준뿐만 아니라 속성이 있지만 그들은 모두 [Required] 속성을 포함하고 또한 유창함의는 NotEmpty() 규칙이 발생합니다 추가 (예를 들어, 같은 유효성 검사를 적용 할 경우, MVC가 화를 얻을 것이다 오류).